



  

<!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-b04ca6fccda778e2.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","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_ahp_tool_call_timing","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_web_integration_cutover","copilot_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","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","issue_viewer_paved_path","issues_expanded_file_types","issues_hide_closed_sub_issues","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","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","primer_react_timeline_list_semantics","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","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-3663bcaacc724f4c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-e7610307df12a842.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-156c6259e31cc551.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-f6ce38f47c2e1d56.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-804a14996977c014.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-fb5d13278eb42203.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-ea613009a991e211.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-24e561c65e946f7d.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.25915bc98fb322a6.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-fe7e72f699fdf493.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-0d35a1220587d888.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-c964b1a3671f2a92.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-1ad12374da9777f2.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-b0e284afdb522622.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-10109ffb41067b06.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-752acdc868e2da64.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-e87ffadced20a3c9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-75bc55d9971828b7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-34620c7b13885011.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-643d2814115561a9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t6-5d0869970ac0aac0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb0-a5c5ec36d311aeef.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-f08c728cf00018aa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/o6-2a1c68d269710ee9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/h9a-c6405aa090de0e84.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vy6-3c3e6e96629c2ce4.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/js-4eb97d5803e657c0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/g7-baf9e817ae102b01.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/unc-96389cade7bad821.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nu-65322a6997c6c93c.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-54f7deb7d2612e69.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.3792087592bf207a.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-f0ae3472e0ece411.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-7afef75d393cf294.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/op-acddf38478d45ef9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-461e4b09f2e67ee5.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-a52ba56147f77909.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-ec4874f70bfd5d76.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-481bd34f90bc2bd7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-ed17e73b4c0bd15e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4-be595475cdbf7d4b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8-23a3c5ff8eef412d.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-9806a0291a782cbe.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ftx-39fb490e3c1d778f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zi-32a0c3c081ea5cce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sg-7a5d50475874c0e1.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pd-6a8710840033e042.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/86g-ec28c25ed7d5de06.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sn-1bab7384818953b7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iq-6d4ecf6d2fb6993c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p2-7d8e7cee5b46cb45.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7d-2e3cc25d719f3a95.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4d-76d8acdf21a33266.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tsb-e0f6288ab985d9d2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/lf-910ef220ce85c660.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2j-2f19c1afd2ceaf93.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/me-f1476ec44a29f34a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p2u-e654a57b1a70c47d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5d-d97cc006d4da4d9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r5-38f013bc2c0fd298.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r6s-9039f5619230a653.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9e-cece06724bf6ea3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/x9-3e077a3a37a73f9f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pj-87629cb5389d7663.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/eq-3764fd5f66494289.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/13-d889936dff7e5c0f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/44-8193eea4af825ead.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v4-9c1327d212e52a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/id-7f39706ba9007db6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ah-271362a1ed227d03.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s1g-d434d712bca59d3a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vz-d7f4a583896f872e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/47-c8c0ce2700acc5be.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-49c8cee7840c9c82.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/pj.75627bfeb9ceb1da.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ah.2623f7c6ecbe2ecd.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/47.78770c57a48a810c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.35603ecb2160763e.module.css" />


  <title>Zsh-Opencode-Tab/README.md at main · alberti42/Zsh-Opencode-Tab · 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:b6687cb9-7bab-9c9f-472c-e993784e7c43">

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


  <meta name="request-id" content="D25E:18B0FD:15B289F:1C8C281:6ACB4104" data-pjax-transient="true"/><meta name="html-safe-nonce" content="8ff853d1b84a3c82a13bd616a09b989941c99262f7a88c168dead44368e4f916" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEMjVFOjE4QjBGRDoxNUIyODlGOjFDOEMyODE6NkFDQjQxMDQiLCJ2aXNpdG9yX2lkIjoiNDk2NzY3ODg1MDI1OTUyMDA0IiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="8919eb69a94387b5a0b04767e2bac119b7c518b7e9af93ec071bf9e03f08bcdc" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1146875276" 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="Natural language → shell command, just press TAB. Contribute to alberti42/Zsh-Opencode-Tab development by creating an account on GitHub.">

      <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/alberti42/Zsh-Opencode-Tab/blob/main/README.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/4cd0e737809d0c30601ecaf04c28c4fee69ba1a23193d02674e676f872e91720/alberti42/Zsh-Opencode-Tab" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Zsh-Opencode-Tab/README.md at main · alberti42/Zsh-Opencode-Tab" /><meta name="twitter:description" content="Natural language → shell command, just press TAB. Contribute to alberti42/Zsh-Opencode-Tab development by creating an account on GitHub." />
  <meta property="og:image" content="https://opengraph.githubassets.com/4cd0e737809d0c30601ecaf04c28c4fee69ba1a23193d02674e676f872e91720/alberti42/Zsh-Opencode-Tab" /><meta property="og:image:alt" content="Natural language → shell command, just press TAB. Contribute to alberti42/Zsh-Opencode-Tab development by creating an account on GitHub." /><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="Zsh-Opencode-Tab/README.md at main · alberti42/Zsh-Opencode-Tab" /><meta property="og:url" content="https://github.com/alberti42/Zsh-Opencode-Tab/blob/main/README.md" /><meta property="og:description" content="Natural language → shell command, just press TAB. Contribute to alberti42/Zsh-Opencode-Tab development by creating an account on GitHub." />
  




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



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


  <meta http-equiv="x-pjax-version" content="e340c92f5eb45f6fb6db73d43b8fee8cb69889b4676afb76c5381963d7bd24ed" 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="a80b0545b169f440b929ce2b977c76b6988f014cca6513fb83c5df6581635fb3" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="86c024975ec65bef61977fbe60782866bd2f48cf8401c77b0337e58b2cab7952" 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/alberti42/Zsh-Opencode-Tab git https://github.com/alberti42/Zsh-Opencode-Tab.git">

  <meta name="octolytics-dimension-user_id" content="61808" /><meta name="octolytics-dimension-user_login" content="alberti42" /><meta name="octolytics-dimension-repository_id" content="1146875276" /><meta name="octolytics-dimension-repository_nwo" content="alberti42/Zsh-Opencode-Tab" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="1146875276" /><meta name="octolytics-dimension-repository_network_root_nwo" content="alberti42/Zsh-Opencode-Tab" />
  



    

    <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="f3c33252c136837d4801bc973e01d185db642a57" 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/19-c660652a0a1639be.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-5af6e2671bf3c355.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.9a3346a06fe1e0b7.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-7cdb285eb17304a3.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.23da07a41d5b850d.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/et9-7eeec247c287fca4.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/94v-e20946127faa8f6e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz5-892a9e99cc92858d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-441e702bfd4c7904.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hw-8ce7888b57d0a23c.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rq-0ec82a12cf538a4d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1m-a7a4c022483b2713.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-d6527f1bfaca19f3.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.fbc35b3d20e988ff.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/1m.fec8b575d0e5234f.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%2Falberti42%2FZsh-Opencode-Tab%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=alberti42%2FZsh-Opencode-Tab","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/alberti42/Zsh-Opencode-Tab/blob/main/README.md\",\"user_id\":null}}","auth_hydro_click_hmac":"6b6e7f45ed502d4b9cbec955b7de963caa3946a3dc92c12631283e77175e0d87","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%2Falberti42%2FZsh-Opencode-Tab%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/alberti42/Zsh-Opencode-Tab/blob/main/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6b6e7f45ed502d4b9cbec955b7de963caa3946a3dc92c12631283e77175e0d87"><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%2Falberti42%2FZsh-Opencode-Tab%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/alberti42/Zsh-Opencode-Tab/blob/main/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6b6e7f45ed502d4b9cbec955b7de963caa3946a3dc92c12631283e77175e0d87"><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=alberti42%2FZsh-Opencode-Tab" 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/alberti42/Zsh-Opencode-Tab/blob/main/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6b6e7f45ed502d4b9cbec955b7de963caa3946a3dc92c12631283e77175e0d87"><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-1c3dd76a-c26d-4971-ad9d-8a536a77310b" aria-labelledby="tooltip-9358c950-4d82-47c9-81fd-75dafe4ab24e" 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-9358c950-4d82-47c9-81fd-75dafe4ab24e" for="icon-button-1c3dd76a-c26d-4971-ad9d-8a536a77310b" 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-6bc2c9bf8112c038.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sk2-8deeef9351be3911.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ni-3e194d222c7770bf.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7x-71d30cb240cd901f.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wwk-ad869086822937b1.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a1-9f79841ecac1da8e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wzg-40a3213b3e83400b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5f-64f8e7d5bcbd4787.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z5-b53a93078d026f1e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8h-cef26f68c1331011.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fq-3ce13a77e863807a.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a7-596b507bd20acddc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xfx-c82d8352413aea0a.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j4-b3a9e87fa7878a98.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-b658a668f60ca56f.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/pj.75627bfeb9ceb1da.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.d9f1a8b5518e8da4.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":"alberti42","is_root":false,"href":"/alberti42"},{"crumb_type":"repository","label":"Zsh-Opencode-Tab","is_root":false,"href":"/alberti42/Zsh-Opencode-Tab"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/alberti42/Zsh-Opencode-Tab","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":"issues","icon":"issue-opened","label":"Issues","href":"/alberti42/Zsh-Opencode-Tab/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":2,"popoverTarget":false,"commandId":"repositories:go-to-issues","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/alberti42/Zsh-Opencode-Tab/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":"/alberti42/Zsh-Opencode-Tab/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":"/alberti42/Zsh-Opencode-Tab/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":"/alberti42/Zsh-Opencode-Tab/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":"/alberti42/Zsh-Opencode-Tab/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:alberti42/Zsh-Opencode-Tab","current_repo_name":"Zsh-Opencode-Tab","current_repo_nwo":"alberti42/Zsh-Opencode-Tab","user_id":"alberti42"}},"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=7","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="/alberti42" data-discover="true"><span class="">alberti42</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/alberti42/Zsh-Opencode-Tab" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">Zsh-Opencode-Tab</span></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="/alberti42/Zsh-Opencode-Tab" 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="issues" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/alberti42/Zsh-Opencode-Tab/issues" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened" 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></span><span data-component="text" data-content="Issues">Issues</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">2</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->2<!-- -->)</span></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="/alberti42/Zsh-Opencode-Tab/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="/alberti42/Zsh-Opencode-Tab/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="/alberti42/Zsh-Opencode-Tab/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="/alberti42/Zsh-Opencode-Tab/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="/alberti42/Zsh-Opencode-Tab/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_2ktp_"><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="/alberti42/Zsh-Opencode-Tab/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":1,"text":"zsh-opencode-tab: a little AI magic in the terminal","anchor":"zsh-opencode-tab-a-little-ai-magic-in-the-terminal","htmlText":"zsh-opencode-tab: a little AI magic in the terminal"},{"level":2,"text":"Quick Look","anchor":"quick-look","htmlText":"Quick Look"},{"level":2,"text":"How It Works (From A User's Point Of View)","anchor":"how-it-works-from-a-users-point-of-view","htmlText":"How It Works (From A User's Point Of View)"},{"level":2,"text":"Pro Tip: Iterate In Place","anchor":"pro-tip-iterate-in-place","htmlText":"Pro Tip: Iterate In Place"},{"level":2,"text":"Requirements","anchor":"requirements","htmlText":"Requirements"},{"level":2,"text":"Installation","anchor":"installation","htmlText":"Installation"},{"level":2,"text":"Usage","anchor":"usage","htmlText":"Usage"},{"level":2,"text":"Mini Demo","anchor":"mini-demo","htmlText":"Mini Demo"},{"level":2,"text":"Configuration","anchor":"configuration","htmlText":"Configuration"},{"level":3,"text":"Common Settings","anchor":"common-settings","htmlText":"Common Settings"},{"level":3,"text":"Advanced: All Customizable Settings","anchor":"advanced-all-customizable-settings","htmlText":"Advanced: All Customizable Settings"},{"level":4,"text":"Core","anchor":"core","htmlText":"Core"},{"level":4,"text":"Spinner","anchor":"spinner","htmlText":"Spinner"},{"level":4,"text":"Opencode","anchor":"opencode","htmlText":"Opencode"},{"level":2,"text":"Agent + Prompt","anchor":"agent--prompt","htmlText":"Agent + Prompt"},{"level":2,"text":"Cold Start vs Attach Mode","anchor":"cold-start-vs-attach-mode","htmlText":"Cold Start vs Attach Mode"},{"level":2,"text":"Troubleshooting","anchor":"troubleshooting","htmlText":"Troubleshooting"},{"level":2,"text":"Credits","anchor":"credits","htmlText":"Credits"},{"level":2,"text":"Author","anchor":"author","htmlText":"Author"},{"level":2,"text":"License","anchor":"license","htmlText":"License"},{"level":2,"text":"Gentle CTA","anchor":"gentle-cta","htmlText":"Gentle CTA"}]},"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=\"https://private-user-images.githubusercontent.com/61808/543995330-5dae9c9f-5cfd-4b56-9037-aca644bf710a.gif?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTUzMzAtNWRhZTljOWYtNWNmZC00YjU2LTkwMzctYWNhNjQ0YmY3MTBhLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRlNzRkZDEwZjFiNGIyODg4NzAxY2JkMjU2MzhlZDQ2ZjlmYzk4YjAwZjhmMjAzZDYzNWVlYWJhYzE3ZWUxODkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRmdpZiJ9.UkAErg6xX7-SkWeloBPVIUnfPJs9OlMmjVNrd63qLhk\"\u003e\u003cimg src=\"https://private-user-images.githubusercontent.com/61808/543995330-5dae9c9f-5cfd-4b56-9037-aca644bf710a.gif?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTUzMzAtNWRhZTljOWYtNWNmZC00YjU2LTkwMzctYWNhNjQ0YmY3MTBhLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRlNzRkZDEwZjFiNGIyODg4NzAxY2JkMjU2MzhlZDQ2ZjlmYzk4YjAwZjhmMjAzZDYzNWVlYWJhYzE3ZWUxODkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRmdpZiJ9.UkAErg6xX7-SkWeloBPVIUnfPJs9OlMmjVNrd63qLhk\" alt=\"A little AI magic in the terminal\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ezsh-opencode-tab: a little AI magic in the terminal\u003c/h1\u003e\u003ca id=\"user-content-zsh-opencode-tab-a-little-ai-magic-in-the-terminal\" class=\"anchor\" aria-label=\"Permalink: zsh-opencode-tab: a little AI magic in the terminal\" href=\"#zsh-opencode-tab-a-little-ai-magic-in-the-terminal\"\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\"\u003eTurn a comment into a command by pressing TAB.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt feels like talking to your terminal.\nYou type what you want as a quick note to yourself, hit TAB, and your prompt fills with a real command you can review.\nSometimes you tweak it. Sometimes you just run it.\nEither way, you stay in control.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis is a zsh plugin, and it plays nicely with Oh My Zsh.\nMost importantly: it keeps your normal TAB completion. It only steps in when you ask for it.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eQuick Look\u003c/h2\u003e\u003ca id=\"user-content-quick-look\" class=\"anchor\" aria-label=\"Permalink: Quick Look\" href=\"#quick-look\"\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\"\u003eType a comment and press TAB:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# list commits between 869b1373 and f1b8edd0, oldest first\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e list commits between 869b1373 and f1b8edd0, oldest first\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAfter TAB, your prompt keeps your request and adds command(s) below:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# list commits between 869b1373 and f1b8edd0, oldest first\ngit rev-list --reverse 869b1373..f1b8edd0\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e list commits between 869b1373 and f1b8edd0, oldest first\u003c/span\u003e\ngit rev-list --reverse 869b1373..f1b8edd0\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSafety line (worth repeating): it never runs anything.\nIt only inserts text into your prompt.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow It Works (From A User's Point Of View)\u003c/h2\u003e\u003ca id=\"user-content-how-it-works-from-a-users-point-of-view\" class=\"anchor\" aria-label=\"Permalink: How It Works (From A User's Point Of View)\" href=\"#how-it-works-from-a-users-point-of-view\"\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\u003eIf the current line starts with \u003ccode\u003e#\u003c/code\u003e, TAB treats it as a request and generates zsh command(s).\u003c/li\u003e\n\u003cli\u003eIf it does not start with \u003ccode\u003e#\u003c/code\u003e, TAB behaves exactly like it did before.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003ePick a prefix:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e# \u0026lt;request\u0026gt;\u0026lt;TAB\u0026gt;\u003c/code\u003e generate command(s)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e#? \u0026lt;question\u0026gt;\u0026lt;TAB\u0026gt;\u003c/code\u003e explanation mode; prints an answer to your terminal (does not edit your prompt)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe persistence behavior is what makes iteration feel nice: keep your draft in the prompt and press TAB again.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePro Tip: Iterate In Place\u003c/h2\u003e\u003ca id=\"user-content-pro-tip-iterate-in-place\" class=\"anchor\" aria-label=\"Permalink: Pro Tip: Iterate In Place\" href=\"#pro-tip-iterate-in-place\"\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\"\u003eWhen you use persistence, your prompt becomes a tiny scratchpad. You're not \"chatting\". You're drafting a command.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFirst TAB gets you a rough draft.\u003c/li\u003e\n\u003cli\u003eNext TAB is a revision pass: you tweak your notes (add another \u003ccode\u003e# ...\u003c/code\u003e line, or edit an existing one) and press TAB again.\u003c/li\u003e\n\u003cli\u003eBecause the old draft stays in the buffer, the agent can refine it instead of reinventing it.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThat means you can do this:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eAsk for a rough draft:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# list all .py files under this folder, one per line\u0026lt;TAB\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e list all .py files under this folder, one per line\u0026lt;TAB\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003col start=\"2\" dir=\"auto\"\u003e\n\u003cli\u003eRefine the request and press TAB again (add another \u003ccode\u003e# ...\u003c/code\u003e line anywhere you like):\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# but exclude files with _test_ in the filename\u0026lt;TAB\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e but exclude files with _test_ in the filename\u0026lt;TAB\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003col start=\"3\" dir=\"auto\"\u003e\n\u003cli\u003eAdd the action you actually want:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# now show line counts for each file and sort biggest first\u0026lt;TAB\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e now show line counts for each file and sort biggest first\u0026lt;TAB\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you ever want to override the default behavior:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eUse \u003ccode\u003e#+\u003c/code\u003e to force persistence for a single request.\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003e#-\u003c/code\u003e to force a \"commands only\" reply (no echoed \u003ccode\u003e# ...\u003c/code\u003e prompt lines).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eYou can keep iterating until it looks right, then run it.\nStill safe: it never runs anything for you.\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eClick to expand the TLDR section on how it works internally\u003c/strong\u003e\u003c/summary\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eZLE widget: intercepts TAB and triggers only on \u003ccode\u003e# ...\u003c/code\u003e lines.\u003c/li\u003e\n\u003cli\u003eController (\u003ccode\u003esrc/controller.zsh\u003c/code\u003e):\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003estarts the worker process\u003c/li\u003e\n\u003cli\u003eshows the Knight Rider spinner while the worker runs\u003c/li\u003e\n\u003cli\u003eupdates \u003ccode\u003eBUFFER\u003c/code\u003e with the generated result on success\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eWorker (\u003ccode\u003esrc/opencode_generate_command.py\u003c/code\u003e):\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eruns \u003ccode\u003eopencode run --format json\u003c/code\u003e and parses NDJSON events\u003c/li\u003e\n\u003cli\u003ereturns \u003ccode\u003esessionID\u0026lt;US\u0026gt;repro_cmd\u0026lt;US\u0026gt;agent_reply\u003c/code\u003e (US = ASCII Unit Separator, 0x1f) so the controller can split it\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eSpinner (\u003ccode\u003esrc/spinner.zsh\u003c/code\u003e): rendering-only; draws via \u003ccode\u003eBUFFER\u003c/code\u003e + \u003ccode\u003eregion_highlight\u003c/code\u003e.\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\"\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\u003cul dir=\"auto\"\u003e\n\u003cli\u003ezsh \u0026gt;= 5.1\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epython3\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopencode\u003c/code\u003e CLI in \u003ccode\u003ePATH\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e(Optional) an opencode server running on your machine or on your premises for attach/warm-start mode\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eNote: this plugin targets macOS and Linux. If you use Windows, run it under WSL.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstallation\u003c/h2\u003e\u003ca id=\"user-content-installation\" class=\"anchor\" aria-label=\"Permalink: Installation\" href=\"#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\"\u003eNote: the \u003ccode\u003eexport\u003c/code\u003e configurations shown below are just examples. For the full list, see \u003cem\u003eConfiguration\u003c/em\u003e.\u003c/p\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\"\u003eIf you use other plugins that customize TAB completion (especially \u003ccode\u003efzf-tab\u003c/code\u003e), you have two options:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eLoad \u003ccode\u003ezsh-opencode-tab\u003c/code\u003e \u003cstrong\u003elast\u003c/strong\u003e (after \u003ccode\u003efzf-tab\u003c/code\u003e and anything else that re-binds TAB).\u003c/li\u003e\n\u003cli\u003eOr keep TAB fully owned by your completion plugin and bind this plugin to another key via \u003ccode\u003eZ_OC_TAB_BINDKEY\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eNon-technical explanation (TL;DR)\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eIn zsh, a key press can only call one thing.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis plugin respects what is already bound to the chosen key (\u003ccode\u003eZ_OC_TAB_BINDKEY\u003c/code\u003e): it steps in only when the prompt line begins with \u003ccode\u003e# ...\u003c/code\u003e; in all other cases, it calls the original widget that was bound to that key.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf another plugin grabs the same key \u003cem\u003eafter\u003c/em\u003e this one loads (common with \u003ccode\u003efzf-tab\u003c/code\u003e), zsh will call that newer binding directly and this plugin will never see the key press.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOn this basis, we recommend option 1) because the binding of this plugin is triggered on a very specific criterion and is unlikely to interfere with any other plugins already installed on your system.\u003c/p\u003e\n\u003c/details\u003e\n\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eOh My Zsh:\u003c/strong\u003e\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eClone this repo into your custom plugins directory:\u003c/li\u003e\n\u003c/ol\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/alberti42/zsh-opencode-tab.git \u0026quot;$ZSH_CUSTOM/plugins/zsh-opencode-tab\u0026quot;\"\u003e\u003cpre\u003egit clone https://github.com/alberti42/zsh-opencode-tab.git \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$ZSH_CUSTOM\u003c/span\u003e/plugins/zsh-opencode-tab\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003col start=\"2\" dir=\"auto\"\u003e\n\u003cli\u003eAdd it to your \u003ccode\u003e.zshrc\u003c/code\u003e:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export \\\n\tZ_OC_TAB_OPENCODE_MODEL=\u0026quot;anthropic/claude-3-5-haiku-latest\u0026quot; \\\n  Z_OC_TAB_EXPLAIN_PRINT_CMD='bat --plain --color=always --decorations=always --language=markdown --paging=never {}'\n\n# IMPORTANT: keep this after plugins like fzf-tab that re-bind TAB.\nplugins+=(zsh-opencode-tab)\n\n# Alternative: bind to a different key (example: Ctrl-G) to avoid TAB conflicts.\n# export Z_OC_TAB_BINDKEY='^G'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e \\\n\tZ_OC_TAB_OPENCODE_MODEL=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eanthropic/claude-3-5-haiku-latest\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n  Z_OC_TAB_EXPLAIN_PRINT_CMD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ebat --plain --color=always --decorations=always --language=markdown --paging=never {}\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 IMPORTANT: keep this after plugins like fzf-tab that re-bind TAB.\u003c/span\u003e\nplugins+=(zsh-opencode-tab)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Alternative: bind to a different key (example: Ctrl-G) to avoid TAB conflicts.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e export Z_OC_TAB_BINDKEY='^G'\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003col start=\"3\" dir=\"auto\"\u003e\n\u003cli\u003eReload your shell:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"exec zsh\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003eexec\u003c/span\u003e zsh\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDo-it-yourself:\u003c/strong\u003e\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eClone this repo into your desired location (e.g., \"$HOME/local/share/my-zsh-plugins\")\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eSource it from your \u003ccode\u003e.zshrc\u003c/code\u003e:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Z_OC_TAB_OPENCODE_MODEL=\u0026quot;anthropic/claude-3-5-haiku-latest\u0026quot;\n# Optional: bind to a different key than TAB (example: Ctrl-G)\n# export Z_OC_TAB_BINDKEY='^G'\nsource \u0026quot;$HOME/local/share/my-zsh-plugins/zsh-opencode-tab/zsh-opencode-tab.plugin.zsh\u0026quot;\"\u003e\u003cpre\u003eZ_OC_TAB_OPENCODE_MODEL=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eanthropic/claude-3-5-haiku-latest\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Optional: bind to a different key than TAB (example: Ctrl-G)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e export Z_OC_TAB_BINDKEY='^G'\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003esource\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$HOME\u003c/span\u003e/local/share/my-zsh-plugins/zsh-opencode-tab/zsh-opencode-tab.plugin.zsh\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ezinit:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOptional: if you want to bind this plugin to a different key than TAB, add e.g. \u003ccode\u003eZ_OC_TAB_BINDKEY=\"^G\"\u003c/code\u003e to the \u003ccode\u003eatinit\u003c/code\u003e export list.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"zinit lucid wait depth=1 from'gh' compile for \\\n  wait'0c' atinit'export Z_OC_TAB_OPENCODE_MODEL=\u0026quot;anthropic/claude-3-5-haiku-latest\u0026quot; \\\n    Z_OC_TAB_SPINNER_BG_HEX=\u0026quot;#24273A\u0026quot; \\\n    Z_OC_TAB_OPENCODE_RUN_MODE=\u0026quot;cold\u0026quot; \\\n    Z_OC_TAB_EXPLAIN_PRINT_CMD=\u0026quot;bat --plain --color=always --decorations=always --language markdown --paging=never {}\u0026quot;' \\\n  @alberti42/zsh-opencode-tab\"\u003e\u003cpre\u003ezinit lucid \u003cspan class=\"pl-c1\"\u003ewait\u003c/span\u003e depth=1 from\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003egh\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e compile \u003cspan class=\"pl-k\"\u003efor\u003c/span\u003e \\\n  wait\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e0c\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e atinit\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eexport Z_OC_TAB_OPENCODE_MODEL=\"anthropic/claude-3-5-haiku-latest\" \\\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e    Z_OC_TAB_SPINNER_BG_HEX=\"#24273A\" \\\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e    Z_OC_TAB_OPENCODE_RUN_MODE=\"cold\" \\\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e    Z_OC_TAB_EXPLAIN_PRINT_CMD=\"bat --plain --color=always --decorations=always --language markdown --paging=never {}\"\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \\\n  @alberti42/zsh-opencode-tab\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsage\u003c/h2\u003e\u003ca id=\"user-content-usage\" class=\"anchor\" aria-label=\"Permalink: Usage\" href=\"#usage\"\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\"\u003eWrite a request preceded by \u003ccode\u003e#\u003c/code\u003e and press TAB (or your configured key via \u003ccode\u003eZ_OC_TAB_BINDKEY\u003c/code\u003e). The plugin updates your prompt with generated command(s), ready to edit/run.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIf the line does not start with \u003ccode\u003e#\u003c/code\u003e, TAB behaves as usual (your original widget is preserved).\u003c/li\u003e\n\u003cli\u003eWhen you press TAB, the generator agent receives your whole prompt buffer (including any previous draft you kept there).\nThis is what makes iteration work: you can refine the request without losing context.\u003c/li\u003e\n\u003cli\u003eMagic prefixes:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e# \u0026lt;request\u0026gt;\u0026lt;TAB\u0026gt;\u003c/code\u003e: generate command(s).\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eBy default, your \u003ccode\u003e# ...\u003c/code\u003e prompt stays in the buffer above the output.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e#? \u0026lt;request\u0026gt;\u0026lt;TAB\u0026gt;\u003c/code\u003e: explanation mode; prints the explanation to the terminal via \u003ccode\u003eZ_OC_TAB_EXPLAIN_PRINT_CMD\u003c/code\u003e (default: \u003ccode\u003ecat\u003c/code\u003e).\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIt does not insert the explanation into the buffer.\u003c/li\u003e\n\u003cli\u003eIf you configure it to use \u003ccode\u003ebat\u003c/code\u003e, make sure \u003ccode\u003ebat\u003c/code\u003e is installed and in \u003ccode\u003ePATH\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eA prefix on its own, with no request after it (\u003ccode\u003e#\u003c/code\u003e, \u003ccode\u003e#?\u003c/code\u003e, \u003ccode\u003e#+\u003c/code\u003e, \u003ccode\u003e#-\u003c/code\u003e, optionally followed by spaces), is not sent anywhere: the key press is handed to whatever was bound to the trigger key before this plugin, so \u003ckbd\u003eTAB\u003c/kbd\u003e still completes as usual.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eOne small convention that makes iteration nice:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eLines that start with a single \u003ccode\u003e#\u003c/code\u003e are treated as \u003cem\u003eyour\u003c/em\u003e prompt notes.\u003c/li\u003e\n\u003cli\u003eIf the agent needs to add notes, it uses \u003ccode\u003e## ...\u003c/code\u003e (double hash).\nThat makes it easy to tell what you wrote vs what the agent added.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMini Demo\u003c/h2\u003e\u003ca id=\"user-content-mini-demo\" class=\"anchor\" aria-label=\"Permalink: Mini Demo\" href=\"#mini-demo\"\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\"\u003eType each request line (starting with \u003ccode\u003e#\u003c/code\u003e) and press TAB.\nThe plugin inserts text into your prompt so you can review it; it does not execute anything.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDemo clip:\u003c/p\u003e\n\u003cdetails open=\"\" class=\"details-reset border rounded-2\"\u003e\n  \u003csummary class=\"tmp-px-3 py-2\"\u003e\n    \u003csvg 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-device-camera-video\"\u003e\n    \u003cpath d=\"M16 3.75v8.5a.75.75 0 0 1-1.136.643L11 10.575v.675A1.75 1.75 0 0 1 9.25 13h-7.5A1.75 1.75 0 0 1 0 11.25v-6.5C0 3.784.784 3 1.75 3h7.5c.966 0 1.75.784 1.75 1.75v.675l3.864-2.318A.75.75 0 0 1 16 3.75Zm-6.5 1a.25.25 0 0 0-.25-.25h-7.5a.25.25 0 0 0-.25.25v6.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-6.5ZM11 8.825l3.5 2.1v-5.85l-3.5 2.1Z\"\u003e\u003c/path\u003e\n\u003c/svg\u003e\n    \u003cspan class=\"m-1\"\u003ezsh-opencode-tab-demo.mov\u003c/span\u003e\n    \u003cspan class=\"dropdown-caret\"\u003e\u003c/span\u003e\n  \u003c/summary\u003e\n\n  \u003cvideo src=\"https://private-user-images.githubusercontent.com/61808/543990178-50318e0b-f945-4058-b446-2a04abbc8142.mov?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTAxNzgtNTAzMThlMGItZjk0NS00MDU4LWI0NDYtMmEwNGFiYmM4MTQyLm1vdj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk0ZTJjNjIyMDdhYTk0YjAyNmVmM2ZjZGVhZTRmNjdjM2U5YjRlNjZiYjlkYzEzMGM3ZGFkOTJkY2Y0YjM1MWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT12aWRlbyUyRnF1aWNrdGltZSJ9.OrDe7VxjLt3fE9AM1RxVesqtPwp7gb5D2S2_--6erOY\" data-canonical-src=\"https://private-user-images.githubusercontent.com/61808/543990178-50318e0b-f945-4058-b446-2a04abbc8142.mov?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTAxNzgtNTAzMThlMGItZjk0NS00MDU4LWI0NDYtMmEwNGFiYmM4MTQyLm1vdj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk0ZTJjNjIyMDdhYTk0YjAyNmVmM2ZjZGVhZTRmNjdjM2U5YjRlNjZiYjlkYzEzMGM3ZGFkOTJkY2Y0YjM1MWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT12aWRlbyUyRnF1aWNrdGltZSJ9.OrDe7VxjLt3fE9AM1RxVesqtPwp7gb5D2S2_--6erOY\" controls=\"controls\" muted=\"muted\" class=\"d-block rounded-bottom-2 border-top width-fit\" style=\"max-height:640px; min-height: 200px\"\u003e\n\n  \u003c/video\u003e\n\u003c/details\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cb\u003eExample:\u003c/b\u003e list commits in a SHA range (in chronological order):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# give me the git command to list (using rev-list) the commits between 869b1373 and f1b8edd0, oldest first\ngit rev-list --reverse 869b1373..f1b8edd0\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e give me the git command to list (using rev-list) the commits between 869b1373 and f1b8edd0, oldest first\u003c/span\u003e\ngit rev-list --reverse 869b1373..f1b8edd0\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cb\u003eExample:\u003c/b\u003e iterate over \u003ccode\u003efd\u003c/code\u003e results and print resolved paths:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# give me a for-loop to iterate over `fd -e zsh`; print the resolved path for each file\nfor file in $(fd -e zsh); do print \u0026quot;$(realpath \u0026quot;$file\u0026quot;)\u0026quot;; done\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e give me a for-loop to iterate over `fd -e zsh`; print the resolved path for each file\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003efor\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003efile\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e$(\u003c/span\u003efd -e zsh\u003cspan class=\"pl-pds\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edo\u003c/span\u003e print \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e$(\u003c/span\u003erealpath \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$file\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edone\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfiguration\u003c/h2\u003e\u003ca id=\"user-content-configuration\" class=\"anchor\" aria-label=\"Permalink: Configuration\" href=\"#configuration\"\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\"\u003eAll settings are resolved once when the plugin is loaded.\nTo change them, update your \u003ccode\u003e.zshrc\u003c/code\u003e and reload your shell (\u003ccode\u003eexec zsh\u003c/code\u003e).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommon Settings\u003c/h3\u003e\u003ca id=\"user-content-common-settings\" class=\"anchor\" aria-label=\"Permalink: Common Settings\" href=\"#common-settings\"\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 the best-looking \"Knight Rider\" fade effect, set the spinner background color to match your terminal background.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Default behavior for plain `# ...` requests.\n# 1: keep the request line above the generated command(s) (default)\n# 0: replace the buffer with generated command(s)\nexport Z_OC_TAB_PERSIST_DEFAULT='1'\n\n# Backend server URL (optional).\n# Used for:\n# - attach mode (warm-start), if you want it\n# - deleting sessions in attach mode (cold mode deletes locally)\nexport Z_OC_TAB_OPENCODE_BACKEND_URL=''\n\n# How to run opencode:\n# - cold (default): run `opencode run` locally (most reliable)\n# - attach: run against the backend server (faster if your server is warm)\nexport Z_OC_TAB_OPENCODE_RUN_MODE='cold'\n\n# Debug: bypass opencode and return a dummy reply immediately.\n# Useful to iterate on UI/integration without making remote calls.\nexport Z_OC_TAB_OPENCODE_DUMMY=0\n# Optional: what to insert into the prompt when dummy mode is enabled.\nexport Z_OC_TAB_OPENCODE_DUMMY_TEXT=\u0026quot;echo 'hello from dummy mode'\u0026quot;\n\n# Speed (seconds per frame)\nexport Z_OC_TAB_SPINNER_INTERVAL='0.03'\n\n# Message shown after the bar\nexport Z_OC_TAB_SPINNER_MESSAGE='Please wait for the agent ...'\n\n# IMPORTANT: set this to your terminal background color.\n# Tip: use a color picker / eyedropper to measure the hex color of your terminal background.\nexport Z_OC_TAB_SPINNER_BG_HEX='#24273A'\n\n# Explanation mode output command (printed to the terminal).\n# Use '{}' as the placeholder for the temporary file path.\nexport Z_OC_TAB_EXPLAIN_PRINT_CMD='bat --plain --color=always --decorations=always --language=markdown --paging=never {}'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Default behavior for plain `# ...` requests.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 1: keep the request line above the generated command(s) (default)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 0: replace the buffer with generated command(s)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_PERSIST_DEFAULT=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e1\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 Backend server URL (optional).\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Used for:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e - attach mode (warm-start), if you want it\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e - deleting sessions in attach mode (cold mode deletes locally)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_OPENCODE_BACKEND_URL=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\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 How to run opencode:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e - cold (default): run `opencode run` locally (most reliable)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e - attach: run against the backend server (faster if your server is warm)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_OPENCODE_RUN_MODE=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ecold\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 Debug: bypass opencode and return a dummy reply immediately.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Useful to iterate on UI/integration without making remote calls.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_OPENCODE_DUMMY=0\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Optional: what to insert into the prompt when dummy mode is enabled.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_OPENCODE_DUMMY_TEXT=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eecho 'hello from dummy mode'\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 Speed (seconds per frame)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_SPINNER_INTERVAL=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e0.03\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 Message shown after the bar\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_SPINNER_MESSAGE=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ePlease wait for the agent ...\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 IMPORTANT: set this to your terminal background color.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Tip: use a color picker / eyedropper to measure the hex color of your terminal background.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_SPINNER_BG_HEX=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e#24273A\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 Explanation mode output command (printed to the terminal).\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Use '{}' as the placeholder for the temporary file path.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e Z_OC_TAB_EXPLAIN_PRINT_CMD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ebat --plain --color=always --decorations=always --language=markdown --paging=never {}\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eHow to pick the right color:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eUse any \"eyedropper\" / color picker tool, click your terminal background, and copy the hex value (like \u003ccode\u003e#1e1e1e\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eOn macOS, the built-in \"Digital Color Meter\" app can do this.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAdvanced: All Customizable Settings\u003c/h3\u003e\u003ca id=\"user-content-advanced-all-customizable-settings\" class=\"anchor\" aria-label=\"Permalink: Advanced: All Customizable Settings\" href=\"#advanced-all-customizable-settings\"\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\"\u003eMost people never need these. They are here if you want to fine-tune the feel of the spinner (speed, colors, fading), or control how opencode is invoked (model, logging).\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eClick to expand the full list\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe plugin reads these environment variables at load time:\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCore\u003c/h4\u003e\u003ca id=\"user-content-core\" class=\"anchor\" aria-label=\"Permalink: Core\" href=\"#core\"\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\u003ccode\u003eZ_OC_TAB_DEBUG\u003c/code\u003e (default: \u003ccode\u003e0\u003c/code\u003e)\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eEnable debug behavior (internal).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eZ_OC_TAB_DEBUG_LOG\u003c/code\u003e (default: \u003ccode\u003e/tmp/zsh-opencode-tab.log\u003c/code\u003e)\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePath to append debug logs to when \u003ccode\u003eZ_OC_TAB_DEBUG=1\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eZ_OC_TAB_BINDKEY\u003c/code\u003e (default: \u003ccode\u003e^I\u003c/code\u003e)\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eWhich key sequence triggers this plugin (bindkey notation).\u003c/li\u003e\n\u003cli\u003eDefault is TAB (i.e., \u003ccode\u003e^I\u003c/code\u003e). Example alternative: \u003ccode\u003e^G\u003c/code\u003e (Ctrl-G).\u003c/li\u003e\n\u003cli\u003eIf another plugin re-binds TAB (e.g. \u003ccode\u003efzf-tab\u003c/code\u003e), set this to a different key to avoid conflicts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eZ_OC_TAB_PERSIST_DEFAULT\u003c/code\u003e (default: \u003ccode\u003e1\u003c/code\u003e)\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eDefault persistence for plain \u003ccode\u003e# ...\u003c/code\u003e requests.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e: keep the request line above the generated output.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e0\u003c/code\u003e: replace the buffer with the generated output.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eZ_OC_TAB_EXPLAIN_PRINT_CMD\u003c/code\u003e (default: \u003ccode\u003ecat\u003c/code\u003e)\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eCommand used to print \u003ccode\u003e#?\u003c/code\u003e explanation output to the terminal.\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003e{}\u003c/code\u003e as a placeholder for the temporary file path.\u003c/li\u003e\n\u003cli\u003eKeep it simple: the value is split on spaces.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSpinner\u003c/h4\u003e\u003ca id=\"user-content-spinner\" class=\"anchor\" aria-label=\"Permalink: Spinner\" href=\"#spinner\"\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\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_MESSAGE\u003c/code\u003e (default: \u003ccode\u003eAI agent is busy ...\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eMessage shown after the spinner bar.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_MESSAGE_FG\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eTruecolor hex foreground for the message, e.g. \u003ccode\u003e#cfcfcf\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_HUE\u003c/code\u003e (default: \u003ccode\u003e280\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eBase hue (0..360).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_SATURATION\u003c/code\u003e (default: \u003ccode\u003e0.30\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eBase saturation (0..1).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_VALUE\u003c/code\u003e (default: \u003ccode\u003e1.0\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eBase brightness (0..1).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_INACTIVE_FACTOR\u003c/code\u003e (default: \u003ccode\u003e0.4\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eDim factor for inactive dots (0..1). This is \"alpha-like\" via background blending.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_ENABLE_FADING\u003c/code\u003e (default: \u003ccode\u003e1\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eEnable global dot fading (1/0).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_MIN_ALPHA\u003c/code\u003e (default: \u003ccode\u003e0.0\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eMinimum fade factor for dots (0..1).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_BG_HEX\u003c/code\u003e (default: \u003ccode\u003e#24273A\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eBackground used for blending and as the bar background. Set it to your terminal background for best results.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_INTERVAL\u003c/code\u003e (default: \u003ccode\u003e0.03\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSeconds per frame (single speed knob).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_SPINNER_POLL_S\u003c/code\u003e (default: \u003ccode\u003e0.005\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePoll interval (seconds) for reading the worker status FIFO.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOpencode\u003c/h4\u003e\u003ca id=\"user-content-opencode\" class=\"anchor\" aria-label=\"Permalink: Opencode\" href=\"#opencode\"\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\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_BACKEND_URL\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eURL of your opencode server.\u003c/li\u003e\n\u003cli\u003eUsed for attach mode.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_WORKDIR\u003c/code\u003e (default: \u003ccode\u003e$XDG_DATA_HOME/zsh-opencode-tab\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eWorking directory used for the \u003ccode\u003eopencode\u003c/code\u003e subprocess.\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eXDG_DATA_HOME\u003c/code\u003e is empty, it falls back to \u003ccode\u003e${TMPDIR:-/tmp}/zsh-opencode-tab\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe plugin keeps sessions in the global workspace (not inside whatever git repo you happen to be in).\u003c/li\u003e\n\u003cli\u003eThe plugin writes its two bundled agents into \u003ccode\u003e${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_RUN_MODE\u003c/code\u003e (default: \u003ccode\u003ecold\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ecold\u003c/code\u003e: run \u003ccode\u003eopencode run\u003c/code\u003e locally (no server attach).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eattach\u003c/code\u003e: run \u003ccode\u003eopencode run --attach \u0026lt;backend_url\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eIf you set \u003ccode\u003eattach\u003c/code\u003e but leave \u003ccode\u003eZ_OC_TAB_OPENCODE_BACKEND_URL\u003c/code\u003e empty, the plugin falls back to \u003ccode\u003ecold\u003c/code\u003e and shows a warning.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_MODEL\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eModel in \u003ccode\u003eprovider/model\u003c/code\u003e form.\u003c/li\u003e\n\u003cli\u003eComprehensive list of providers/models: \u003ca href=\"https://models.dev/\" rel=\"nofollow\"\u003ehttps://models.dev/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecommended: first try the model in a regular \u003ccode\u003eopencode\u003c/code\u003e session (outside this plugin) to confirm your provider credentials are set up and your account has credits/billing to use it.\u003c/li\u003e\n\u003cli\u003eThis sets the model for both generation and explanation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_MODEL_GENERATOR\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eOptional: model override for command generation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_MODEL_EXPLAINER\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eOptional: model override for explanation mode.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_AGENT_GENERATOR\u003c/code\u003e (default: \u003ccode\u003eshell_cmd_generator\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAgent name for command generation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_AGENT_EXPLAINER\u003c/code\u003e (default: \u003ccode\u003eshell_cmd_explainer\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAgent name for explanation mode.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_VARIANT_GENERATOR\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eOptional model variant for command generation, passed to opencode as \u003ccode\u003e--variant\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eA variant is the provider-specific reasoning effort, e.g. \u003ccode\u003eminimal\u003c/code\u003e, \u003ccode\u003ehigh\u003c/code\u003e, \u003ccode\u003emax\u003c/code\u003e. The accepted values depend on the provider; the value is forwarded unchanged.\u003c/li\u003e\n\u003cli\u003eGeneration emits a single shell command, and on a reasoning model the thinking phase dominates the response time. \u003ccode\u003eminimal\u003c/code\u003e is usually the right choice here.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_VARIANT_EXPLAINER\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eOptional model variant for explanation mode.\u003c/li\u003e\n\u003cli\u003eExplanations are prose rather than one command, so a higher effort is easier to justify than it is for generation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_VARIANT\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eDeprecated.\u003c/strong\u003e Sets the variant for both generation and explanation.\u003c/li\u003e\n\u003cli\u003eKept for backwards compatibility. Prefer \u003ccode\u003eZ_OC_TAB_OPENCODE_VARIANT_GENERATOR\u003c/code\u003e and \u003ccode\u003eZ_OC_TAB_OPENCODE_VARIANT_EXPLAINER\u003c/code\u003e, which let you spend reasoning effort where it pays off instead of applying one setting to two modes with different needs.\u003c/li\u003e\n\u003cli\u003eWhen set together with a per-mode variable, the per-mode variable wins.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_TITLE\u003c/code\u003e (default: \u003ccode\u003ezsh shell assistant\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSession title.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_LOG_LEVEL\u003c/code\u003e (default: empty)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePasses \u003ccode\u003e--log-level\u003c/code\u003e to opencode (\u003ccode\u003eDEBUG\u003c/code\u003e, \u003ccode\u003eINFO\u003c/code\u003e, \u003ccode\u003eWARN\u003c/code\u003e, \u003ccode\u003eERROR\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_PRINT_LOGS\u003c/code\u003e (default: \u003ccode\u003e0\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIf set to \u003ccode\u003e1\u003c/code\u003e, passes \u003ccode\u003e--print-logs\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_DELETE_SESSION\u003c/code\u003e (default: \u003ccode\u003e1\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIf set to \u003ccode\u003e1\u003c/code\u003e, deletes the created session after receiving the answer.\u003c/li\u003e\n\u003cli\u003eIn \u003ccode\u003eattach\u003c/code\u003e mode: deletes via the server API (requires \u003ccode\u003eZ_OC_TAB_OPENCODE_BACKEND_URL\u003c/code\u003e), which costs no extra process because the server is already running.\u003c/li\u003e\n\u003cli\u003eIn \u003ccode\u003ecold\u003c/code\u003e mode: deletes by running \u003ccode\u003eopencode session delete\u003c/code\u003e (no server needed).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_GNU\u003c/code\u003e (\u003ccode\u003e0\u003c/code\u003e or \u003ccode\u003e1\u003c/code\u003e; default: \u003ccode\u003e1\u003c/code\u003e)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePassed to the agent whether to prefer GNU tools over macOS/freeBSD.\u003c/li\u003e\n\u003c/ul\u003e\n\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\"\u003eAgent + Prompt\u003c/h2\u003e\u003ca id=\"user-content-agent--prompt\" class=\"anchor\" aria-label=\"Permalink: Agent + Prompt\" href=\"#agent--prompt\"\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 plugin bundles two agent definitions (prompt files) for opencode:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOne tuned for generating zsh command(s).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOne tuned for explaining commands and shell workflows.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eDefault generator agent: \u003ccode\u003eshell_cmd_generator\u003c/code\u003e (definition: \u003ccode\u003eopencode/agents/shell_cmd_generator.md\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eDefault explainer agent: \u003ccode\u003eshell_cmd_explainer\u003c/code\u003e (definition: \u003ccode\u003eopencode/agents/shell_cmd_explainer.md\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eCustom agents: set \u003ccode\u003eZ_OC_TAB_OPENCODE_AGENT_GENERATOR\u003c/code\u003e and/or \u003ccode\u003eZ_OC_TAB_OPENCODE_AGENT_EXPLAINER\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eCustom prompts: copy the agent file under \u003ccode\u003e${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/\u003c/code\u003e to a new filename and select it using \u003ccode\u003eZ_OC_TAB_OPENCODE_AGENT_GENERATOR\u003c/code\u003e and \u003ccode\u003eZ_OC_TAB_OPENCODE_AGENT_EXPLAINER\u003c/code\u003e. Note that the plugin overwrites its own bundled filenames \u003ccode\u003eshell_cmd_generator.md\u003c/code\u003e and \u003ccode\u003eshell_cmd_explainer.md\u003c/code\u003e to keep upgrades deterministic; thus, avoid modifying the bundled agents.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eTip: when you are iterating on the agent prompt, use cold start (\u003ccode\u003eZ_OC_TAB_OPENCODE_RUN_MODE=cold\u003c/code\u003e). It's the least confusing setup: you edit a file, reload your shell, and the next TAB uses it.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCold Start vs Attach Mode\u003c/h2\u003e\u003ca id=\"user-content-cold-start-vs-attach-mode\" class=\"anchor\" aria-label=\"Permalink: Cold Start vs Attach Mode\" href=\"#cold-start-vs-attach-mode\"\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\n\u003cp dir=\"auto\"\u003eCold start (default): simplest and most reliable.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eYou do not run/attach to any server.\u003c/li\u003e\n\u003cli\u003eEach TAB request runs \u003ccode\u003eopencode\u003c/code\u003e from \u003ccode\u003eZ_OC_TAB_OPENCODE_WORKDIR\u003c/code\u003e, which keeps sessions in the global workspace.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eAttach mode (optional): same experience, less startup overhead.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eRun an opencode server and set:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_RUN_MODE='attach'\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eZ_OC_TAB_OPENCODE_BACKEND_URL='http://127.0.0.1:4096'\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eThe plugin already keeps its two agent files under \u003ccode\u003e${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/\u003c/code\u003e, and attach mode can use those too.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\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\"\u003eKnown upstream rough edges (so you're not surprised):\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAttach mode may return \u003cstrong\u003eno answer for some models\u003c/strong\u003e.\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAttach does work: \u003ccode\u003eopenai/gpt-5.4-mini-fast\u003c/code\u003e, for instance, answers normally over a warm server. But some models return nothing on every request, and others are intermittent — the same model can succeed and then fail minutes later against the same server.\u003c/li\u003e\n\u003cli\u003eWhen it happens, the server runs the request correctly and stores the reply, but the attached client receives no text and exits successfully, so the plugin reports \u003ccode\u003eopencode returned no output (empty reply)\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eObserved on opencode 1.18.18. We have not found the root cause, and the evidence points at opencode rather than at this plugin: the same request in cold start always works, and the answer that never reaches the client can be found afterwards in opencode's own session storage.\u003c/li\u003e\n\u003cli\u003eIf you hit it, try another model before giving up on attach mode; cold start (the default) is unaffected.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eTwo earlier attach-mode problems are now fixed upstream. They are listed here only so that anyone running an older opencode knows what to look for; the fix in both cases is to upgrade.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAttach mode used to ignore \u003cem\u003ewhich helper\u003c/em\u003e you asked for, so \u003ccode\u003e--agent shell_cmd_generator\u003c/code\u003e and \u003ccode\u003e--agent shell_cmd_explainer\u003c/code\u003e had no effect over a server.\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFixed by \u003ca class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"3886629914\" data-permission-text=\"Title is private\" data-url=\"https://github.com/anomalyco/opencode/issues/11812\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/anomalyco/opencode/pull/11812/hovercard\" href=\"https://github.com/anomalyco/opencode/pull/11812\"\u003eanomalyco/opencode#11812\u003c/a\u003e (merged 2026-03-03).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eA password-protected server used to answer \"Unauthorized\" on attach even with the right password.\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFixed by \u003ca class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"4371939318\" data-permission-text=\"Title is private\" data-url=\"https://github.com/anomalyco/opencode/issues/25596\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/anomalyco/opencode/pull/25596/hovercard\" href=\"https://github.com/anomalyco/opencode/pull/25596\"\u003eanomalyco/opencode#25596\u003c/a\u003e and \u003ca class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"4372010728\" data-permission-text=\"Title is private\" data-url=\"https://github.com/anomalyco/opencode/issues/25600\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/anomalyco/opencode/pull/25600/hovercard\" href=\"https://github.com/anomalyco/opencode/pull/25600\"\u003eanomalyco/opencode#25600\u003c/a\u003e (both merged 2026-05-03).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\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\u003cul dir=\"auto\"\u003e\n\u003cli\u003eNothing happens on TAB:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eThe plugin only triggers when the line starts with \u003ccode\u003e#\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eIf you use \u003ccode\u003efzf-tab\u003c/code\u003e (or any plugin that re-binds TAB), load \u003ccode\u003ezsh-opencode-tab\u003c/code\u003e last or set \u003ccode\u003eZ_OC_TAB_BINDKEY\u003c/code\u003e to another key.\u003c/li\u003e\n\u003cli\u003eQuick check (default TAB): \u003ccode\u003ebindkey -M emacs '^I'\u003c/code\u003e should point to \u003ccode\u003e_zsh_opencode_tab_or_fallback\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eQuick check (example Ctrl-G): \u003ccode\u003ebindkey -M emacs '^G'\u003c/code\u003e should point to \u003ccode\u003e_zsh_opencode_tab_or_fallback\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eThe spinner runs but the buffer does not change:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eEnsure \u003ccode\u003eopencode\u003c/code\u003e is in \u003ccode\u003ePATH\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eIf using attach mode, ensure the opencode server is running at \u003ccode\u003eZ_OC_TAB_OPENCODE_BACKEND_URL\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eTemporarily set \u003ccode\u003eZ_OC_TAB_OPENCODE_LOG_LEVEL=DEBUG\u003c/code\u003e and \u003ccode\u003eZ_OC_TAB_OPENCODE_PRINT_LOGS=1\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCredits\u003c/h2\u003e\u003ca id=\"user-content-credits\" class=\"anchor\" aria-label=\"Permalink: Credits\" href=\"#credits\"\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\"\u003eIdea inspired by \u003ccode\u003ehttps://github.com/verlihirsh/zsh-opencode-plugin\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAuthor\u003c/h2\u003e\u003ca id=\"user-content-author\" class=\"anchor\" aria-label=\"Permalink: Author\" href=\"#author\"\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\u003eAuthor:\u003c/strong\u003e Andrea Alberti\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGitHub Profile:\u003c/strong\u003e \u003ca href=\"https://github.com/alberti42\"\u003ealberti42\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDonations:\u003c/strong\u003e \u003ca href=\"https://buymeacoffee.com/alberti\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8ac3061cb2662e57a3c500a62a767a4bbf2ce869341a3fad60642e0c78c6cfd0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f6e6174652d4275792532304d6525323061253230436f666665652d6f72616e6765\" alt=\"Buy Me a Coffee\" data-canonical-src=\"https://img.shields.io/badge/Donate-Buy%20Me%20a%20Coffee-orange\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFeel free to contribute to the development of this plugin or report any issues in the \u003ca href=\"https://github.com/alberti42/Zsh-Opencode-Tab/issues\"\u003eGitHub repository\u003c/a\u003e.\u003c/p\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\"\u003eThis project is licensed under the MIT License. See the \u003ca href=\"/alberti42/Zsh-Opencode-Tab/blob/main/LICENSE\"\u003eLICENSE\u003c/a\u003e file for details.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGentle CTA\u003c/h2\u003e\u003ca id=\"user-content-gentle-cta\" class=\"anchor\" aria-label=\"Permalink: Gentle CTA\" href=\"#gentle-cta\"\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 want to get a feel for it in 10 seconds: install it, open a new terminal, type a line starting with \u003ccode\u003e#\u003c/code\u003e, and press TAB.\nIf it clicks, consider starring the repo: \u003ca href=\"https://github.com/alberti42/zsh-opencode-tab\"\u003ehttps://github.com/alberti42/zsh-opencode-tab\u003c/a\u003e\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":true,"not_analyzed":false,"symbols":[{"name":"zsh-opencode-tab: a little AI magic in the terminal","fully_qualified_name":"zsh-opencode-tab: a little AI magic in the terminal","kind":"section_1","ident_start":163,"ident_end":214,"extent_start":161,"extent_end":21457,"ident_utf16":{"start":{"line_number":4,"utf16_col":2},"end":{"line_number":4,"utf16_col":53}},"extent_utf16":{"start":{"line_number":4,"utf16_col":0},"end":{"line_number":462,"utf16_col":0}}},{"name":"Quick Look","fully_qualified_name":"Quick Look","kind":"section_2","ident_start":663,"ident_end":673,"extent_start":660,"extent_end":1055,"ident_utf16":{"start":{"line_number":16,"utf16_col":3},"end":{"line_number":16,"utf16_col":13}},"extent_utf16":{"start":{"line_number":16,"utf16_col":0},"end":{"line_number":34,"utf16_col":0}}},{"name":"How It Works (From A User's Point Of View)","fully_qualified_name":"How It Works (From A User's Point Of View)","kind":"section_2","ident_start":1058,"ident_end":1100,"extent_start":1055,"extent_end":1545,"ident_utf16":{"start":{"line_number":34,"utf16_col":3},"end":{"line_number":34,"utf16_col":45}},"extent_utf16":{"start":{"line_number":34,"utf16_col":0},"end":{"line_number":46,"utf16_col":0}}},{"name":"Pro Tip: Iterate In Place","fully_qualified_name":"Pro Tip: Iterate In Place","kind":"section_2","ident_start":1548,"ident_end":1573,"extent_start":1545,"extent_end":3313,"ident_utf16":{"start":{"line_number":46,"utf16_col":3},"end":{"line_number":46,"utf16_col":28}},"extent_utf16":{"start":{"line_number":46,"utf16_col":0},"end":{"line_number":96,"utf16_col":0}}},{"name":"Requirements","fully_qualified_name":"Requirements","kind":"section_2","ident_start":3316,"ident_end":3328,"extent_start":3313,"extent_end":3568,"ident_utf16":{"start":{"line_number":96,"utf16_col":3},"end":{"line_number":96,"utf16_col":15}},"extent_utf16":{"start":{"line_number":96,"utf16_col":0},"end":{"line_number":105,"utf16_col":0}}},{"name":"Installation","fully_qualified_name":"Installation","kind":"section_2","ident_start":3571,"ident_end":3583,"extent_start":3568,"extent_end":6364,"ident_utf16":{"start":{"line_number":105,"utf16_col":3},"end":{"line_number":105,"utf16_col":15}},"extent_utf16":{"start":{"line_number":105,"utf16_col":0},"end":{"line_number":181,"utf16_col":0}}},{"name":"Usage","fully_qualified_name":"Usage","kind":"section_2","ident_start":6367,"ident_end":6372,"extent_start":6364,"extent_end":7786,"ident_utf16":{"start":{"line_number":181,"utf16_col":3},"end":{"line_number":181,"utf16_col":8}},"extent_utf16":{"start":{"line_number":181,"utf16_col":0},"end":{"line_number":202,"utf16_col":0}}},{"name":"Mini Demo","fully_qualified_name":"Mini Demo","kind":"section_2","ident_start":7789,"ident_end":7798,"extent_start":7786,"extent_end":8511,"ident_utf16":{"start":{"line_number":202,"utf16_col":3},"end":{"line_number":202,"utf16_col":12}},"extent_utf16":{"start":{"line_number":202,"utf16_col":0},"end":{"line_number":225,"utf16_col":0}}},{"name":"Configuration","fully_qualified_name":"Configuration","kind":"section_2","ident_start":8514,"ident_end":8527,"extent_start":8511,"extent_end":16538,"ident_utf16":{"start":{"line_number":225,"utf16_col":3},"end":{"line_number":225,"utf16_col":16}},"extent_utf16":{"start":{"line_number":225,"utf16_col":0},"end":{"line_number":389,"utf16_col":0}}},{"name":"Common Settings","fully_qualified_name":"Common Settings","kind":"section_3","ident_start":8665,"ident_end":8680,"extent_start":8661,"extent_end":10525,"ident_utf16":{"start":{"line_number":230,"utf16_col":4},"end":{"line_number":230,"utf16_col":19}},"extent_utf16":{"start":{"line_number":230,"utf16_col":0},"end":{"line_number":277,"utf16_col":0}}},{"name":"Advanced: All Customizable Settings","fully_qualified_name":"Advanced: All Customizable Settings","kind":"section_3","ident_start":10529,"ident_end":10564,"extent_start":10525,"extent_end":16538,"ident_utf16":{"start":{"line_number":277,"utf16_col":4},"end":{"line_number":277,"utf16_col":39}},"extent_utf16":{"start":{"line_number":277,"utf16_col":0},"end":{"line_number":389,"utf16_col":0}}},{"name":"Core","fully_qualified_name":"Core","kind":"section_4","ident_start":10880,"ident_end":10884,"extent_start":10875,"extent_end":11784,"ident_utf16":{"start":{"line_number":286,"utf16_col":5},"end":{"line_number":286,"utf16_col":9}},"extent_utf16":{"start":{"line_number":286,"utf16_col":0},"end":{"line_number":305,"utf16_col":0}}},{"name":"Spinner","fully_qualified_name":"Spinner","kind":"section_4","ident_start":11789,"ident_end":11796,"extent_start":11784,"extent_end":12913,"ident_utf16":{"start":{"line_number":305,"utf16_col":5},"end":{"line_number":305,"utf16_col":12}},"extent_utf16":{"start":{"line_number":305,"utf16_col":0},"end":{"line_number":334,"utf16_col":0}}},{"name":"Opencode","fully_qualified_name":"Opencode","kind":"section_4","ident_start":12918,"ident_end":12926,"extent_start":12913,"extent_end":16538,"ident_utf16":{"start":{"line_number":334,"utf16_col":5},"end":{"line_number":334,"utf16_col":13}},"extent_utf16":{"start":{"line_number":334,"utf16_col":0},"end":{"line_number":389,"utf16_col":0}}},{"name":"Agent + Prompt","fully_qualified_name":"Agent + Prompt","kind":"section_2","ident_start":16541,"ident_end":16555,"extent_start":16538,"extent_end":17632,"ident_utf16":{"start":{"line_number":389,"utf16_col":3},"end":{"line_number":389,"utf16_col":17}},"extent_utf16":{"start":{"line_number":389,"utf16_col":0},"end":{"line_number":403,"utf16_col":0}}},{"name":"Cold Start vs Attach Mode","fully_qualified_name":"Cold Start vs Attach Mode","kind":"section_2","ident_start":17635,"ident_end":17660,"extent_start":17632,"extent_end":19904,"ident_utf16":{"start":{"line_number":403,"utf16_col":3},"end":{"line_number":403,"utf16_col":28}},"extent_utf16":{"start":{"line_number":403,"utf16_col":0},"end":{"line_number":431,"utf16_col":0}}},{"name":"Troubleshooting","fully_qualified_name":"Troubleshooting","kind":"section_2","ident_start":19907,"ident_end":19922,"extent_start":19904,"extent_end":20634,"ident_utf16":{"start":{"line_number":431,"utf16_col":3},"end":{"line_number":431,"utf16_col":18}},"extent_utf16":{"start":{"line_number":431,"utf16_col":0},"end":{"line_number":443,"utf16_col":0}}},{"name":"Credits","fully_qualified_name":"Credits","kind":"section_2","ident_start":20637,"ident_end":20644,"extent_start":20634,"extent_end":20717,"ident_utf16":{"start":{"line_number":443,"utf16_col":3},"end":{"line_number":443,"utf16_col":10}},"extent_utf16":{"start":{"line_number":443,"utf16_col":0},"end":{"line_number":447,"utf16_col":0}}},{"name":"Author","fully_qualified_name":"Author","kind":"section_2","ident_start":20720,"ident_end":20726,"extent_start":20717,"extent_end":21121,"ident_utf16":{"start":{"line_number":447,"utf16_col":3},"end":{"line_number":447,"utf16_col":9}},"extent_utf16":{"start":{"line_number":447,"utf16_col":0},"end":{"line_number":454,"utf16_col":0}}},{"name":"License","fully_qualified_name":"License","kind":"section_2","ident_start":21124,"ident_end":21131,"extent_start":21121,"extent_end":21227,"ident_utf16":{"start":{"line_number":454,"utf16_col":3},"end":{"line_number":454,"utf16_col":10}},"extent_utf16":{"start":{"line_number":454,"utf16_col":0},"end":{"line_number":458,"utf16_col":0}}},{"name":"Gentle CTA","fully_qualified_name":"Gentle CTA","kind":"section_2","ident_start":21230,"ident_end":21240,"extent_start":21227,"extent_end":21457,"ident_utf16":{"start":{"line_number":458,"utf16_col":3},"end":{"line_number":458,"utf16_col":13}},"extent_utf16":{"start":{"line_number":458,"utf16_col":0},"end":{"line_number":462,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1146875276,"defaultBranch":"main","name":"Zsh-Opencode-Tab","ownerLogin":"alberti42","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-01-31T20:27:38.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/61808?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"F-mW0Y9JfWOgZPgpVO7dRPa4D-n6du5-zYK3fEk1zqrnqC9F0HcNJ3EeoXZTevhXImitFrBfFjbBl4hWyChjSg","allShortcutsEnabled":false,"treeExpanded":true,"path":"README.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1786804070.0","canEdit":false,"currentOid":"54d49ba5582be45193d90fec14639bd1da96c7fd"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"bin","path":"bin","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"opencode","path":"opencode","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"TODO.md","path":"TODO.md","contentType":"file"},{"name":"zsh-opencode-tab-banner.gif","path":"zsh-opencode-tab-banner.gif","contentType":"file"},{"name":"zsh-opencode-tab.plugin.zsh","path":"zsh-opencode-tab.plugin.zsh","contentType":"file"}],"totalCount":12}},"fileTreeProcessingTime":58.755199,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1786804070.0","canEdit":false,"refType":"branch","currentOid":"54d49ba5582be45193d90fec14639bd1da96c7fd","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"README.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/alberti42/Zsh-Opencode-Tab/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"README.md","displayUrl":"https://github.com/alberti42/Zsh-Opencode-Tab/blob/main/README.md?raw=true","headerInfo":{"blobSize":"21 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":"f102c23","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Falberti42%2FZsh-Opencode-Tab%2Fblob%2Fmain%2FREADME.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"462","truncatedSloc":"347"},"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":"/alberti42/Zsh-Opencode-Tab/blob/main/README.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/alberti42/Zsh-Opencode-Tab/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/alberti42/Zsh-Opencode-Tab/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=\"https://github.com/user-attachments/assets/5dae9c9f-5cfd-4b56-9037-aca644bf710a\" alt=\"A little AI magic in the terminal\" /\u003e","\u003c/p\u003e","","# zsh-opencode-tab: a little AI magic in the terminal","","Turn a comment into a command by pressing TAB.","","It feels like talking to your terminal.","You type what you want as a quick note to yourself, hit TAB, and your prompt fills with a real command you can review.","Sometimes you tweak it. Sometimes you just run it.","Either way, you stay in control.","","This is a zsh plugin, and it plays nicely with Oh My Zsh.","Most importantly: it keeps your normal TAB completion. It only steps in when you ask for it.","","## Quick Look","","Type a comment and press TAB:","","```zsh","# list commits between 869b1373 and f1b8edd0, oldest first","```","","After TAB, your prompt keeps your request and adds command(s) below:","","```zsh","# list commits between 869b1373 and f1b8edd0, oldest first","git rev-list --reverse 869b1373..f1b8edd0","```","","Safety line (worth repeating): it never runs anything.","It only inserts text into your prompt.","","## How It Works (From A User's Point Of View)","","- If the current line starts with `#`, TAB treats it as a request and generates zsh command(s).","- If it does not start with `#`, TAB behaves exactly like it did before.","","Pick a prefix:","","- `# \u003crequest\u003e\u003cTAB\u003e` generate command(s)","- `#? \u003cquestion\u003e\u003cTAB\u003e` explanation mode; prints an answer to your terminal (does not edit your prompt)","","The persistence behavior is what makes iteration feel nice: keep your draft in the prompt and press TAB again.","","## Pro Tip: Iterate In Place","","When you use persistence, your prompt becomes a tiny scratchpad. You're not \"chatting\". You're drafting a command.","","- First TAB gets you a rough draft.","- Next TAB is a revision pass: you tweak your notes (add another `# ...` line, or edit an existing one) and press TAB again.","- Because the old draft stays in the buffer, the agent can refine it instead of reinventing it.","","That means you can do this:","","1) Ask for a rough draft:","","```zsh","# list all .py files under this folder, one per line\u003cTAB\u003e","```","","2) Refine the request and press TAB again (add another `# ...` line anywhere you like):","","```zsh","# but exclude files with _test_ in the filename\u003cTAB\u003e","```","","3) Add the action you actually want:","","```zsh","# now show line counts for each file and sort biggest first\u003cTAB\u003e","```","","If you ever want to override the default behavior:","","- Use `#+` to force persistence for a single request.","- Use `#-` to force a \"commands only\" reply (no echoed `# ...` prompt lines).","","You can keep iterating until it looks right, then run it.","Still safe: it never runs anything for you.","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eClick to expand the TLDR section on how it works internally\u003c/strong\u003e\u003c/summary\u003e","","- ZLE widget: intercepts TAB and triggers only on `# ...` lines.","- Controller (`src/controller.zsh`):","  - starts the worker process","  - shows the Knight Rider spinner while the worker runs","  - updates `BUFFER` with the generated result on success","- Worker (`src/opencode_generate_command.py`):","  - runs `opencode run --format json` and parses NDJSON events","  - returns `sessionID\u003cUS\u003erepro_cmd\u003cUS\u003eagent_reply` (US = ASCII Unit Separator, 0x1f) so the controller can split it","- Spinner (`src/spinner.zsh`): rendering-only; draws via `BUFFER` + `region_highlight`.","\u003c/details\u003e","","## Requirements","","- zsh \u003e= 5.1","- `python3`","- `opencode` CLI in `PATH`","- (Optional) an opencode server running on your machine or on your premises for attach/warm-start mode","","Note: this plugin targets macOS and Linux. If you use Windows, run it under WSL.","","## Installation","","Note: the `export` configurations shown below are just examples. For the full list, see _Configuration_.","","\u003e [!IMPORTANT]","\u003e If you use other plugins that customize TAB completion (especially `fzf-tab`), you have two options:","\u003e ","\u003e 1) Load `zsh-opencode-tab` **last** (after `fzf-tab` and anything else that re-binds TAB).","\u003e 2) Or keep TAB fully owned by your completion plugin and bind this plugin to another key via `Z_OC_TAB_BINDKEY`.","\u003e","\u003e \u003cdetails\u003e","\u003e \u003csummary\u003e\u003cstrong\u003eNon-technical explanation (TL;DR)\u003c/strong\u003e\u003c/summary\u003e","\u003e","\u003e In zsh, a key press can only call one thing.","\u003e","\u003e This plugin respects what is already bound to the chosen key (`Z_OC_TAB_BINDKEY`): it steps in only when the prompt line begins with `# ...`; in all other cases, it calls the original widget that was bound to that key.","\u003e","\u003e If another plugin grabs the same key *after* this one loads (common with `fzf-tab`), zsh will call that newer binding directly and this plugin will never see the key press.","\u003e","\u003e On this basis, we recommend option 1) because the binding of this plugin is triggered on a very specific criterion and is unlikely to interfere with any other plugins already installed on your system.","\u003e \u003c/details\u003e","","**Oh My Zsh:**","","1) Clone this repo into your custom plugins directory:","","```zsh","git clone https://github.com/alberti42/zsh-opencode-tab.git \"$ZSH_CUSTOM/plugins/zsh-opencode-tab\"","```","","2) Add it to your `.zshrc`:","","```zsh","export \\","\tZ_OC_TAB_OPENCODE_MODEL=\"anthropic/claude-3-5-haiku-latest\" \\","  Z_OC_TAB_EXPLAIN_PRINT_CMD='bat --plain --color=always --decorations=always --language=markdown --paging=never {}'","","# IMPORTANT: keep this after plugins like fzf-tab that re-bind TAB.","plugins+=(zsh-opencode-tab)","","# Alternative: bind to a different key (example: Ctrl-G) to avoid TAB conflicts.","# export Z_OC_TAB_BINDKEY='^G'","```","","3) Reload your shell:","","```zsh","exec zsh","```","","**Do-it-yourself:**","","1) Clone this repo into your desired location (e.g., \"$HOME/local/share/my-zsh-plugins\")","","2) Source it from your `.zshrc`:","","```zsh","Z_OC_TAB_OPENCODE_MODEL=\"anthropic/claude-3-5-haiku-latest\"","# Optional: bind to a different key than TAB (example: Ctrl-G)","# export Z_OC_TAB_BINDKEY='^G'","source \"$HOME/local/share/my-zsh-plugins/zsh-opencode-tab/zsh-opencode-tab.plugin.zsh\"","```","","**zinit:**","","Optional: if you want to bind this plugin to a different key than TAB, add e.g. `Z_OC_TAB_BINDKEY=\"^G\"` to the `atinit` export list.","","```zsh","zinit lucid wait depth=1 from'gh' compile for \\","  wait'0c' atinit'export Z_OC_TAB_OPENCODE_MODEL=\"anthropic/claude-3-5-haiku-latest\" \\","    Z_OC_TAB_SPINNER_BG_HEX=\"#24273A\" \\","    Z_OC_TAB_OPENCODE_RUN_MODE=\"cold\" \\","    Z_OC_TAB_EXPLAIN_PRINT_CMD=\"bat --plain --color=always --decorations=always --language markdown --paging=never {}\"' \\","  @alberti42/zsh-opencode-tab","```","","## Usage","","Write a request preceded by `#` and press TAB (or your configured key via `Z_OC_TAB_BINDKEY`). The plugin updates your prompt with generated command(s), ready to edit/run.","","- If the line does not start with `#`, TAB behaves as usual (your original widget is preserved).","- When you press TAB, the generator agent receives your whole prompt buffer (including any previous draft you kept there).","  This is what makes iteration work: you can refine the request without losing context.","- Magic prefixes:","  - `# \u003crequest\u003e\u003cTAB\u003e`: generate command(s).","    - By default, your `# ...` prompt stays in the buffer above the output.","  - `#? \u003crequest\u003e\u003cTAB\u003e`: explanation mode; prints the explanation to the terminal via `Z_OC_TAB_EXPLAIN_PRINT_CMD` (default: `cat`).","    - It does not insert the explanation into the buffer.","    - If you configure it to use `bat`, make sure `bat` is installed and in `PATH`.","  - A prefix on its own, with no request after it (`#`, `#?`, `#+`, `#-`, optionally followed by spaces), is not sent anywhere: the key press is handed to whatever was bound to the trigger key before this plugin, so \u003ckbd\u003eTAB\u003c/kbd\u003e still completes as usual.","","One small convention that makes iteration nice:","","- Lines that start with a single `#` are treated as *your* prompt notes.","- If the agent needs to add notes, it uses `## ...` (double hash).","  That makes it easy to tell what you wrote vs what the agent added.","","## Mini Demo","","Type each request line (starting with `#`) and press TAB.","The plugin inserts text into your prompt so you can review it; it does not execute anything.","","Demo clip:","","\u003chttps://github.com/user-attachments/assets/50318e0b-f945-4058-b446-2a04abbc8142\u003e","","\u003cb\u003eExample:\u003c/b\u003e list commits in a SHA range (in chronological order):","","```zsh","# give me the git command to list (using rev-list) the commits between 869b1373 and f1b8edd0, oldest first","git rev-list --reverse 869b1373..f1b8edd0","```","","\u003cb\u003eExample:\u003c/b\u003e iterate over `fd` results and print resolved paths:","","```zsh","# give me a for-loop to iterate over `fd -e zsh`; print the resolved path for each file","for file in $(fd -e zsh); do print \"$(realpath \"$file\")\"; done","```","","## Configuration","","All settings are resolved once when the plugin is loaded.","To change them, update your `.zshrc` and reload your shell (`exec zsh`).","","### Common Settings","","For the best-looking \"Knight Rider\" fade effect, set the spinner background color to match your terminal background.","","```zsh","# Default behavior for plain `# ...` requests.","# 1: keep the request line above the generated command(s) (default)","# 0: replace the buffer with generated command(s)","export Z_OC_TAB_PERSIST_DEFAULT='1'","","# Backend server URL (optional).","# Used for:","# - attach mode (warm-start), if you want it","# - deleting sessions in attach mode (cold mode deletes locally)","export Z_OC_TAB_OPENCODE_BACKEND_URL=''","","# How to run opencode:","# - cold (default): run `opencode run` locally (most reliable)","# - attach: run against the backend server (faster if your server is warm)","export Z_OC_TAB_OPENCODE_RUN_MODE='cold'","","# Debug: bypass opencode and return a dummy reply immediately.","# Useful to iterate on UI/integration without making remote calls.","export Z_OC_TAB_OPENCODE_DUMMY=0","# Optional: what to insert into the prompt when dummy mode is enabled.","export Z_OC_TAB_OPENCODE_DUMMY_TEXT=\"echo 'hello from dummy mode'\"","","# Speed (seconds per frame)","export Z_OC_TAB_SPINNER_INTERVAL='0.03'","","# Message shown after the bar","export Z_OC_TAB_SPINNER_MESSAGE='Please wait for the agent ...'","","# IMPORTANT: set this to your terminal background color.","# Tip: use a color picker / eyedropper to measure the hex color of your terminal background.","export Z_OC_TAB_SPINNER_BG_HEX='#24273A'","","# Explanation mode output command (printed to the terminal).","# Use '{}' as the placeholder for the temporary file path.","export Z_OC_TAB_EXPLAIN_PRINT_CMD='bat --plain --color=always --decorations=always --language=markdown --paging=never {}'","```","","How to pick the right color:","","- Use any \"eyedropper\" / color picker tool, click your terminal background, and copy the hex value (like `#1e1e1e`).","- On macOS, the built-in \"Digital Color Meter\" app can do this.","","### Advanced: All Customizable Settings","","Most people never need these. They are here if you want to fine-tune the feel of the spinner (speed, colors, fading), or control how opencode is invoked (model, logging).","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eClick to expand the full list\u003c/strong\u003e\u003c/summary\u003e","","The plugin reads these environment variables at load time:","","#### Core","","- `Z_OC_TAB_DEBUG` (default: `0`)","  - Enable debug behavior (internal).","- `Z_OC_TAB_DEBUG_LOG` (default: `/tmp/zsh-opencode-tab.log`)","  - Path to append debug logs to when `Z_OC_TAB_DEBUG=1`.","- `Z_OC_TAB_BINDKEY` (default: `^I`)","  - Which key sequence triggers this plugin (bindkey notation).","  - Default is TAB (i.e., `^I`). Example alternative: `^G` (Ctrl-G).","  - If another plugin re-binds TAB (e.g. `fzf-tab`), set this to a different key to avoid conflicts.","- `Z_OC_TAB_PERSIST_DEFAULT` (default: `1`)","  - Default persistence for plain `# ...` requests.","  - `1`: keep the request line above the generated output.","  - `0`: replace the buffer with the generated output.","- `Z_OC_TAB_EXPLAIN_PRINT_CMD` (default: `cat`)","  - Command used to print `#?` explanation output to the terminal.","  - Use `{}` as a placeholder for the temporary file path.","  - Keep it simple: the value is split on spaces.","","#### Spinner","","- `Z_OC_TAB_SPINNER_MESSAGE` (default: `AI agent is busy ...`)","  - Message shown after the spinner bar.","- `Z_OC_TAB_SPINNER_MESSAGE_FG` (default: empty)","  - Truecolor hex foreground for the message, e.g. `#cfcfcf`.","","- `Z_OC_TAB_SPINNER_HUE` (default: `280`)","  - Base hue (0..360).","- `Z_OC_TAB_SPINNER_SATURATION` (default: `0.30`)","  - Base saturation (0..1).","- `Z_OC_TAB_SPINNER_VALUE` (default: `1.0`)","  - Base brightness (0..1).","","- `Z_OC_TAB_SPINNER_INACTIVE_FACTOR` (default: `0.4`)","  - Dim factor for inactive dots (0..1). This is \"alpha-like\" via background blending.","- `Z_OC_TAB_SPINNER_ENABLE_FADING` (default: `1`)","  - Enable global dot fading (1/0).","- `Z_OC_TAB_SPINNER_MIN_ALPHA` (default: `0.0`)","  - Minimum fade factor for dots (0..1).","","- `Z_OC_TAB_SPINNER_BG_HEX` (default: `#24273A`)","  - Background used for blending and as the bar background. Set it to your terminal background for best results.","","- `Z_OC_TAB_SPINNER_INTERVAL` (default: `0.03`)","  - Seconds per frame (single speed knob).","- `Z_OC_TAB_SPINNER_POLL_S` (default: `0.005`)","  - Poll interval (seconds) for reading the worker status FIFO.","","#### Opencode",""," - `Z_OC_TAB_OPENCODE_BACKEND_URL` (default: empty)","   - URL of your opencode server.","    - Used for attach mode."," - `Z_OC_TAB_OPENCODE_WORKDIR` (default: `$XDG_DATA_HOME/zsh-opencode-tab`)","   - Working directory used for the `opencode` subprocess.","   - If `XDG_DATA_HOME` is empty, it falls back to `${TMPDIR:-/tmp}/zsh-opencode-tab`.","   - The plugin keeps sessions in the global workspace (not inside whatever git repo you happen to be in).","   - The plugin writes its two bundled agents into `${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/`."," - `Z_OC_TAB_OPENCODE_RUN_MODE` (default: `cold`)","   - `cold`: run `opencode run` locally (no server attach).","   - `attach`: run `opencode run --attach \u003cbackend_url\u003e`.","   - If you set `attach` but leave `Z_OC_TAB_OPENCODE_BACKEND_URL` empty, the plugin falls back to `cold` and shows a warning.","- `Z_OC_TAB_OPENCODE_MODEL` (default: empty)","  - Model in `provider/model` form.","  - Comprehensive list of providers/models: https://models.dev/","  - Recommended: first try the model in a regular `opencode` session (outside this plugin) to confirm your provider credentials are set up and your account has credits/billing to use it.","  - This sets the model for both generation and explanation.","- `Z_OC_TAB_OPENCODE_MODEL_GENERATOR` (default: empty)","  - Optional: model override for command generation.","- `Z_OC_TAB_OPENCODE_MODEL_EXPLAINER` (default: empty)","  - Optional: model override for explanation mode.","- `Z_OC_TAB_OPENCODE_AGENT_GENERATOR` (default: `shell_cmd_generator`)","  - Agent name for command generation.","- `Z_OC_TAB_OPENCODE_AGENT_EXPLAINER` (default: `shell_cmd_explainer`)","  - Agent name for explanation mode.","- `Z_OC_TAB_OPENCODE_VARIANT_GENERATOR` (default: empty)","  - Optional model variant for command generation, passed to opencode as `--variant`.","  - A variant is the provider-specific reasoning effort, e.g. `minimal`, `high`, `max`. The accepted values depend on the provider; the value is forwarded unchanged.","  - Generation emits a single shell command, and on a reasoning model the thinking phase dominates the response time. `minimal` is usually the right choice here.","- `Z_OC_TAB_OPENCODE_VARIANT_EXPLAINER` (default: empty)","  - Optional model variant for explanation mode.","  - Explanations are prose rather than one command, so a higher effort is easier to justify than it is for generation.","- `Z_OC_TAB_OPENCODE_VARIANT` (default: empty)","  - **Deprecated.** Sets the variant for both generation and explanation.","  - Kept for backwards compatibility. Prefer `Z_OC_TAB_OPENCODE_VARIANT_GENERATOR` and `Z_OC_TAB_OPENCODE_VARIANT_EXPLAINER`, which let you spend reasoning effort where it pays off instead of applying one setting to two modes with different needs.","  - When set together with a per-mode variable, the per-mode variable wins.","- `Z_OC_TAB_OPENCODE_TITLE` (default: `zsh shell assistant`)","  - Session title.","","- `Z_OC_TAB_OPENCODE_LOG_LEVEL` (default: empty)","  - Passes `--log-level` to opencode (`DEBUG`, `INFO`, `WARN`, `ERROR`).","- `Z_OC_TAB_OPENCODE_PRINT_LOGS` (default: `0`)","  - If set to `1`, passes `--print-logs`.","- `Z_OC_TAB_OPENCODE_DELETE_SESSION` (default: `1`)","  - If set to `1`, deletes the created session after receiving the answer.","  - In `attach` mode: deletes via the server API (requires `Z_OC_TAB_OPENCODE_BACKEND_URL`), which costs no extra process because the server is already running.","  - In `cold` mode: deletes by running `opencode session delete` (no server needed).","","- `Z_OC_TAB_OPENCODE_GNU` (`0` or `1`; default: `1`)","  - Passed to the agent whether to prefer GNU tools over macOS/freeBSD.","","\u003c/details\u003e","","## Agent + Prompt","","This plugin bundles two agent definitions (prompt files) for opencode:","","- One tuned for generating zsh command(s).","- One tuned for explaining commands and shell workflows.","","- Default generator agent: `shell_cmd_generator` (definition: `opencode/agents/shell_cmd_generator.md`).","- Default explainer agent: `shell_cmd_explainer` (definition: `opencode/agents/shell_cmd_explainer.md`).","- Custom agents: set `Z_OC_TAB_OPENCODE_AGENT_GENERATOR` and/or `Z_OC_TAB_OPENCODE_AGENT_EXPLAINER`.","- Custom prompts: copy the agent file under `${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/` to a new filename and select it using `Z_OC_TAB_OPENCODE_AGENT_GENERATOR` and `Z_OC_TAB_OPENCODE_AGENT_EXPLAINER`. Note that the plugin overwrites its own bundled filenames `shell_cmd_generator.md` and `shell_cmd_explainer.md` to keep upgrades deterministic; thus, avoid modifying the bundled agents.","","Tip: when you are iterating on the agent prompt, use cold start (`Z_OC_TAB_OPENCODE_RUN_MODE=cold`). It's the least confusing setup: you edit a file, reload your shell, and the next TAB uses it.","","## Cold Start vs Attach Mode","","- Cold start (default): simplest and most reliable.","  - You do not run/attach to any server.","  - Each TAB request runs `opencode` from `Z_OC_TAB_OPENCODE_WORKDIR`, which keeps sessions in the global workspace.","","- Attach mode (optional): same experience, less startup overhead.","  - Run an opencode server and set:","    - `Z_OC_TAB_OPENCODE_RUN_MODE='attach'`","    - `Z_OC_TAB_OPENCODE_BACKEND_URL='http://127.0.0.1:4096'`","  - The plugin already keeps its two agent files under `${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/`, and attach mode can use those too.","","\u003e [!WARNING]","\u003e Known upstream rough edges (so you're not surprised):","\u003e","\u003e - Attach mode may return **no answer for some models**.","\u003e   - Attach does work: `openai/gpt-5.4-mini-fast`, for instance, answers normally over a warm server. But some models return nothing on every request, and others are intermittent — the same model can succeed and then fail minutes later against the same server.","\u003e   - When it happens, the server runs the request correctly and stores the reply, but the attached client receives no text and exits successfully, so the plugin reports `opencode returned no output (empty reply)`.","\u003e   - Observed on opencode 1.18.18. We have not found the root cause, and the evidence points at opencode rather than at this plugin: the same request in cold start always works, and the answer that never reaches the client can be found afterwards in opencode's own session storage.","\u003e   - If you hit it, try another model before giving up on attach mode; cold start (the default) is unaffected.","\u003e","\u003e Two earlier attach-mode problems are now fixed upstream. They are listed here only so that anyone running an older opencode knows what to look for; the fix in both cases is to upgrade.","\u003e","\u003e - Attach mode used to ignore *which helper* you asked for, so `--agent shell_cmd_generator` and `--agent shell_cmd_explainer` had no effect over a server.","\u003e   - Fixed by https://github.com/anomalyco/opencode/pull/11812 (merged 2026-03-03).","\u003e - A password-protected server used to answer \"Unauthorized\" on attach even with the right password.","\u003e   - Fixed by https://github.com/anomalyco/opencode/pull/25596 and https://github.com/anomalyco/opencode/pull/25600 (both merged 2026-05-03).","","## Troubleshooting","","- Nothing happens on TAB:","  - The plugin only triggers when the line starts with `#`.","  - If you use `fzf-tab` (or any plugin that re-binds TAB), load `zsh-opencode-tab` last or set `Z_OC_TAB_BINDKEY` to another key.","  - Quick check (default TAB): `bindkey -M emacs '^I'` should point to `_zsh_opencode_tab_or_fallback`.","  - Quick check (example Ctrl-G): `bindkey -M emacs '^G'` should point to `_zsh_opencode_tab_or_fallback`.","- The spinner runs but the buffer does not change:","  - Ensure `opencode` is in `PATH`.","  - If using attach mode, ensure the opencode server is running at `Z_OC_TAB_OPENCODE_BACKEND_URL`.","  - Temporarily set `Z_OC_TAB_OPENCODE_LOG_LEVEL=DEBUG` and `Z_OC_TAB_OPENCODE_PRINT_LOGS=1`.","","## Credits","","Idea inspired by `https://github.com/verlihirsh/zsh-opencode-plugin`.","","## Author","- **Author:** Andrea Alberti","- **GitHub Profile:** [alberti42](https://github.com/alberti42)","- **Donations:** [![Buy Me a Coffee](https://img.shields.io/badge/Donate-Buy%20Me%20a%20Coffee-orange)](https://buymeacoffee.com/alberti)","","Feel free to contribute to the development of this plugin or report any issues in the [GitHub repository](https://github.com/alberti42/Zsh-Opencode-Tab/issues).","","## License","","This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.","","## Gentle CTA","","If you want to get a feel for it in 10 seconds: install it, open a new terminal, type a line starting with `#`, and press TAB.","If it clicks, consider starring the repo: https://github.com/alberti42/zsh-opencode-tab"],"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,91,"pl-s"],[91,92,"pl-s"],[93,96,"pl-e"],[97,98,"pl-s"],[98,131,"pl-s"],[131,132,"pl-s"]],[[2,3,"pl-ent"]],[],[[0,53,"pl-mh"],[2,53,"pl-en"]],[],[],[],[],[],[],[],[],[],[],[],[[0,13,"pl-mh"],[3,13,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,58,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,58,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[],[],[[0,45,"pl-mh"],[3,45,"pl-en"]],[],[[0,1,"pl-v"],[34,35,"pl-s"],[35,36,"pl-c1"],[36,37,"pl-s"]],[[0,1,"pl-v"],[28,29,"pl-s"],[29,30,"pl-c1"],[30,31,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"]],[],[],[],[[0,28,"pl-mh"],[3,28,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"],[65,66,"pl-s"],[66,71,"pl-c1"],[71,72,"pl-s"]],[[0,1,"pl-v"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,57,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[55,56,"pl-s"],[56,61,"pl-c1"],[61,62,"pl-s"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,52,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,64,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"],[6,7,"pl-s"],[7,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[6,7,"pl-s"],[7,9,"pl-c1"],[9,10,"pl-s"],[55,56,"pl-s"],[56,61,"pl-c1"],[61,62,"pl-s"]],[],[],[],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[78,84,"pl-ent"],[87,94,"pl-ent"]],[],[[0,1,"pl-v"],[50,51,"pl-s"],[51,56,"pl-c1"],[56,57,"pl-s"]],[[0,1,"pl-v"],[14,15,"pl-s"],[15,33,"pl-c1"],[33,34,"pl-s"]],[[2,3,"pl-v"]],[[2,3,"pl-v"]],[[2,3,"pl-v"],[12,13,"pl-s"],[13,19,"pl-c1"],[19,20,"pl-s"]],[[0,1,"pl-v"],[10,11,"pl-s"],[11,43,"pl-c1"],[43,44,"pl-s"]],[[2,3,"pl-v"],[9,10,"pl-s"],[10,36,"pl-c1"],[36,37,"pl-s"]],[[2,3,"pl-v"],[12,13,"pl-s"],[13,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-v"],[11,12,"pl-s"],[12,27,"pl-c1"],[27,28,"pl-s"],[57,58,"pl-s"],[58,64,"pl-c1"],[64,65,"pl-s"],[68,69,"pl-s"],[69,85,"pl-c1"],[85,86,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[20,21,"pl-s"],[21,25,"pl-c1"],[25,26,"pl-s"]],[[0,1,"pl-v"]],[],[],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[10,11,"pl-s"],[11,17,"pl-c1"],[17,18,"pl-s"],[88,89,"pl-s"],[102,103,"pl-s"]],[],[[0,14,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[13,14,"pl-s"]],[[0,102,"pl-ent"],[0,2,"pl-ent"],[69,70,"pl-s"],[70,77,"pl-c1"],[77,78,"pl-s"]],[[0,2,"pl-ent"],[0,2,"pl-ent"]],[[0,92,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[3,4,"pl-v"],[10,11,"pl-s"],[11,27,"pl-c1"],[27,28,"pl-s"],[29,31,"pl-s"],[35,37,"pl-s"],[45,46,"pl-s"],[46,53,"pl-c1"],[53,54,"pl-s"]],[[0,114,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[3,4,"pl-v"],[95,96,"pl-s"],[96,112,"pl-c1"],[112,113,"pl-s"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,11,"pl-ent"],[0,2,"pl-ent"],[3,10,"pl-ent"]],[[0,71,"pl-ent"],[0,2,"pl-ent"],[3,10,"pl-ent"],[12,18,"pl-ent"],[54,60,"pl-ent"],[63,70,"pl-ent"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,46,"pl-ent"],[0,2,"pl-ent"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,220,"pl-ent"],[0,2,"pl-ent"],[64,65,"pl-s"],[65,81,"pl-c1"],[81,82,"pl-s"],[135,136,"pl-s"],[136,141,"pl-c1"],[141,142,"pl-s"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,174,"pl-ent"],[0,2,"pl-ent"],[39,40,"pl-s"],[45,46,"pl-s"],[75,76,"pl-s"],[76,83,"pl-c1"],[83,84,"pl-s"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,202,"pl-ent"],[0,2,"pl-ent"]],[[0,12,"pl-ent"],[0,2,"pl-ent"],[4,11,"pl-ent"]],[[0,0,"pl-ent"]],[[0,2,"pl-s"],[12,14,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[60,98,"pl-s"],[60,61,"pl-pds"],[61,72,"pl-smi"],[97,98,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[18,19,"pl-s"],[19,25,"pl-c1"],[25,26,"pl-s"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,6,"pl-k"]],[[25,60,"pl-s"],[25,26,"pl-pds"],[59,60,"pl-pds"]],[[29,116,"pl-s"],[29,30,"pl-pds"],[115,116,"pl-pds"]],[],[[0,67,"pl-c"],[0,1,"pl-c"]],[],[],[[0,80,"pl-c"],[0,1,"pl-c"]],[[0,30,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,4,"pl-c1"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[17,19,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[23,24,"pl-s"],[24,30,"pl-c1"],[30,31,"pl-s"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[24,59,"pl-s"],[24,25,"pl-pds"],[58,59,"pl-pds"]],[[0,62,"pl-c"],[0,1,"pl-c"]],[[0,30,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-c1"],[7,86,"pl-s"],[7,8,"pl-pds"],[8,13,"pl-smi"],[85,86,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[8,10,"pl-s"]],[],[[80,81,"pl-s"],[81,102,"pl-c1"],[102,103,"pl-s"],[111,112,"pl-s"],[112,118,"pl-c1"],[118,119,"pl-s"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[12,16,"pl-c1"],[29,33,"pl-s"],[29,30,"pl-pds"],[32,33,"pl-pds"],[42,45,"pl-k"]],[[6,10,"pl-s"],[6,7,"pl-pds"],[9,10,"pl-pds"],[17,86,"pl-s"],[17,18,"pl-pds"]],[[0,39,"pl-s"]],[[0,39,"pl-s"]],[[0,119,"pl-s"],[118,119,"pl-pds"]],[],[[0,3,"pl-s"]],[],[[0,8,"pl-mh"],[3,8,"pl-en"]],[],[[28,29,"pl-s"],[29,30,"pl-c1"],[30,31,"pl-s"],[74,75,"pl-s"],[75,91,"pl-c1"],[91,92,"pl-s"]],[],[[0,1,"pl-v"],[34,35,"pl-s"],[35,36,"pl-c1"],[36,37,"pl-s"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[[2,3,"pl-v"],[4,5,"pl-s"],[5,21,"pl-c1"],[21,22,"pl-s"]],[[4,5,"pl-v"],[23,24,"pl-s"],[24,29,"pl-c1"],[29,30,"pl-s"]],[[2,3,"pl-v"],[4,5,"pl-s"],[5,22,"pl-c1"],[22,23,"pl-s"],[86,87,"pl-s"],[87,113,"pl-c1"],[113,114,"pl-s"],[125,126,"pl-s"],[126,129,"pl-c1"],[129,130,"pl-s"]],[[4,5,"pl-v"]],[[4,5,"pl-v"],[33,34,"pl-s"],[34,37,"pl-c1"],[37,38,"pl-s"],[50,51,"pl-s"],[51,54,"pl-c1"],[54,55,"pl-s"],[76,77,"pl-s"],[77,81,"pl-c1"],[81,82,"pl-s"]],[[2,3,"pl-v"],[51,52,"pl-s"],[52,53,"pl-c1"],[53,54,"pl-s"],[56,57,"pl-s"],[57,59,"pl-c1"],[59,60,"pl-s"],[62,63,"pl-s"],[63,65,"pl-c1"],[65,66,"pl-s"],[68,69,"pl-s"],[69,71,"pl-c1"],[71,72,"pl-s"],[217,220,"pl-ent"],[226,229,"pl-ent"]],[],[],[],[[0,1,"pl-v"],[33,34,"pl-s"],[34,35,"pl-c1"],[35,36,"pl-s"],[52,53,"pl-s"],[57,58,"pl-s"]],[[0,1,"pl-v"],[43,44,"pl-s"],[44,50,"pl-c1"],[50,51,"pl-s"]],[],[],[[0,12,"pl-mh"],[3,12,"pl-en"]],[],[[38,39,"pl-s"],[39,40,"pl-c1"],[40,41,"pl-s"]],[],[],[],[],[[0,1,"pl-s"],[1,80,"pl-corl"],[80,81,"pl-s"]],[],[[1,2,"pl-ent"],[13,14,"pl-ent"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,106,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[[1,2,"pl-ent"],[13,14,"pl-ent"],[29,30,"pl-s"],[30,32,"pl-c1"],[32,33,"pl-s"]],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,87,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-k"],[4,8,"pl-smi"],[9,11,"pl-k"],[12,24,"pl-s"],[12,14,"pl-pds"],[23,24,"pl-pds"],[24,25,"pl-k"],[26,28,"pl-k"],[35,56,"pl-s"],[35,36,"pl-pds"],[36,55,"pl-s"],[36,38,"pl-pds"],[47,54,"pl-s"],[47,48,"pl-pds"],[48,53,"pl-smi"],[53,54,"pl-pds"],[54,55,"pl-pds"],[55,56,"pl-pds"],[56,57,"pl-k"],[58,62,"pl-k"]],[[0,3,"pl-s"]],[],[[0,16,"pl-mh"],[3,16,"pl-en"]],[],[],[[28,29,"pl-s"],[29,35,"pl-c1"],[35,36,"pl-s"],[60,61,"pl-s"],[61,69,"pl-c1"],[69,70,"pl-s"]],[],[[0,19,"pl-mh"],[4,19,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[0,46,"pl-c"],[0,1,"pl-c"]],[[0,67,"pl-c"],[0,1,"pl-c"]],[[0,49,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[32,35,"pl-s"],[32,33,"pl-pds"],[34,35,"pl-pds"]],[],[[0,32,"pl-c"],[0,1,"pl-c"]],[[0,11,"pl-c"],[0,1,"pl-c"]],[[0,44,"pl-c"],[0,1,"pl-c"]],[[0,64,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[37,39,"pl-s"],[37,38,"pl-pds"],[38,39,"pl-pds"]],[],[[0,22,"pl-c"],[0,1,"pl-c"]],[[0,62,"pl-c"],[0,1,"pl-c"]],[[0,74,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[34,40,"pl-s"],[34,35,"pl-pds"],[39,40,"pl-pds"]],[],[[0,62,"pl-c"],[0,1,"pl-c"]],[[0,66,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[[0,70,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[36,66,"pl-s"],[36,37,"pl-pds"],[65,66,"pl-pds"]],[],[[0,27,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[33,39,"pl-s"],[33,34,"pl-pds"],[38,39,"pl-pds"]],[],[[0,29,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[32,63,"pl-s"],[32,33,"pl-pds"],[62,63,"pl-pds"]],[],[[0,56,"pl-c"],[0,1,"pl-c"]],[[0,92,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[31,40,"pl-s"],[31,32,"pl-pds"],[39,40,"pl-pds"]],[],[[0,60,"pl-c"],[0,1,"pl-c"]],[[0,58,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[34,121,"pl-s"],[34,35,"pl-pds"],[120,121,"pl-pds"]],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"],[105,106,"pl-s"],[106,113,"pl-c1"],[113,114,"pl-s"]],[[0,1,"pl-v"]],[],[[0,39,"pl-mh"],[4,39,"pl-en"]],[],[],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[48,54,"pl-ent"],[57,64,"pl-ent"]],[],[],[],[[0,9,"pl-mh"],[5,9,"pl-en"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[29,30,"pl-s"],[30,31,"pl-c1"],[31,32,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[33,34,"pl-s"],[34,59,"pl-c1"],[59,60,"pl-s"]],[[2,3,"pl-v"],[38,39,"pl-s"],[39,55,"pl-c1"],[55,56,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[31,32,"pl-s"],[32,34,"pl-c1"],[34,35,"pl-s"]],[[2,3,"pl-v"]],[[2,3,"pl-v"],[26,27,"pl-s"],[27,29,"pl-c1"],[29,30,"pl-s"],[54,55,"pl-s"],[55,57,"pl-c1"],[57,58,"pl-s"]],[[2,3,"pl-v"],[41,42,"pl-s"],[42,49,"pl-c1"],[49,50,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,27,"pl-c1"],[27,28,"pl-s"],[39,40,"pl-s"],[40,41,"pl-c1"],[41,42,"pl-s"]],[[2,3,"pl-v"],[34,35,"pl-s"],[35,40,"pl-c1"],[40,41,"pl-s"]],[[2,3,"pl-v"],[4,5,"pl-s"],[5,6,"pl-c1"],[6,7,"pl-s"]],[[2,3,"pl-v"],[4,5,"pl-s"],[5,6,"pl-c1"],[6,7,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[41,42,"pl-s"],[42,45,"pl-c1"],[45,46,"pl-s"]],[[2,3,"pl-v"],[26,27,"pl-s"],[27,29,"pl-c1"],[29,30,"pl-s"]],[[2,3,"pl-v"],[8,9,"pl-s"],[9,11,"pl-c1"],[11,12,"pl-s"]],[[2,3,"pl-v"]],[],[[0,12,"pl-mh"],[5,12,"pl-en"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,27,"pl-c1"],[27,28,"pl-s"],[39,40,"pl-s"],[40,60,"pl-c1"],[60,61,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,30,"pl-c1"],[30,31,"pl-s"]],[[2,3,"pl-v"],[51,52,"pl-s"],[52,59,"pl-c1"],[59,60,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,23,"pl-c1"],[23,24,"pl-s"],[35,36,"pl-s"],[36,39,"pl-c1"],[39,40,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,30,"pl-c1"],[30,31,"pl-s"],[42,43,"pl-s"],[43,47,"pl-c1"],[47,48,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,25,"pl-c1"],[25,26,"pl-s"],[37,38,"pl-s"],[38,41,"pl-c1"],[41,42,"pl-s"]],[[2,3,"pl-v"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,35,"pl-c1"],[35,36,"pl-s"],[47,48,"pl-s"],[48,51,"pl-c1"],[51,52,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,33,"pl-c1"],[33,34,"pl-s"],[45,46,"pl-s"],[46,47,"pl-c1"],[47,48,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[41,42,"pl-s"],[42,45,"pl-c1"],[45,46,"pl-s"]],[[2,3,"pl-v"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[38,39,"pl-s"],[39,46,"pl-c1"],[46,47,"pl-s"]],[[2,3,"pl-v"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,28,"pl-c1"],[28,29,"pl-s"],[40,41,"pl-s"],[41,45,"pl-c1"],[45,46,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[38,39,"pl-s"],[39,44,"pl-c1"],[44,45,"pl-s"]],[[2,3,"pl-v"]],[],[[0,13,"pl-mh"],[5,13,"pl-en"]],[],[[1,2,"pl-v"],[3,4,"pl-s"],[4,33,"pl-c1"],[33,34,"pl-s"]],[[3,4,"pl-v"]],[[4,5,"pl-v"]],[[1,2,"pl-v"],[3,4,"pl-s"],[4,29,"pl-c1"],[29,30,"pl-s"],[41,42,"pl-s"],[42,73,"pl-c1"],[73,74,"pl-s"]],[[3,4,"pl-v"],[36,37,"pl-s"],[37,45,"pl-c1"],[45,46,"pl-s"]],[[3,4,"pl-v"],[8,9,"pl-s"],[9,22,"pl-c1"],[22,23,"pl-s"],[51,52,"pl-s"],[52,84,"pl-c1"],[84,85,"pl-s"]],[[3,4,"pl-v"]],[[3,4,"pl-v"],[51,52,"pl-s"],[52,98,"pl-c1"],[98,99,"pl-s"]],[[1,2,"pl-v"],[3,4,"pl-s"],[4,30,"pl-c1"],[30,31,"pl-s"],[42,43,"pl-s"],[43,47,"pl-c1"],[47,48,"pl-s"]],[[3,4,"pl-v"],[5,6,"pl-s"],[6,10,"pl-c1"],[10,11,"pl-s"],[17,18,"pl-s"],[18,30,"pl-c1"],[30,31,"pl-s"]],[[3,4,"pl-v"],[5,6,"pl-s"],[6,12,"pl-c1"],[12,13,"pl-s"],[19,20,"pl-s"],[20,55,"pl-c1"],[55,56,"pl-s"]],[[3,4,"pl-v"],[16,17,"pl-s"],[17,23,"pl-c1"],[23,24,"pl-s"],[35,36,"pl-s"],[36,65,"pl-c1"],[65,66,"pl-s"],[99,100,"pl-s"],[100,104,"pl-c1"],[104,105,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"]],[[2,3,"pl-v"],[13,14,"pl-s"],[14,28,"pl-c1"],[28,29,"pl-s"]],[[2,3,"pl-v"],[44,63,"pl-corl"]],[[2,3,"pl-v"],[50,51,"pl-s"],[51,59,"pl-c1"],[59,60,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,36,"pl-c1"],[36,37,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,36,"pl-c1"],[36,37,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,36,"pl-c1"],[36,37,"pl-s"],[48,49,"pl-s"],[49,68,"pl-c1"],[68,69,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,36,"pl-c1"],[36,37,"pl-s"],[48,49,"pl-s"],[49,68,"pl-c1"],[68,69,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,38,"pl-c1"],[38,39,"pl-s"]],[[2,3,"pl-v"],[73,74,"pl-s"],[74,83,"pl-c1"],[83,84,"pl-s"]],[[2,3,"pl-v"],[62,63,"pl-s"],[63,70,"pl-c1"],[70,71,"pl-s"],[73,74,"pl-s"],[74,78,"pl-c1"],[78,79,"pl-s"],[81,82,"pl-s"],[82,85,"pl-c1"],[85,86,"pl-s"]],[[2,3,"pl-v"],[118,119,"pl-s"],[119,126,"pl-c1"],[126,127,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,38,"pl-c1"],[38,39,"pl-s"]],[[2,3,"pl-v"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,28,"pl-c1"],[28,29,"pl-s"]],[[2,3,"pl-v"],[4,6,"pl-s"],[17,19,"pl-s"]],[[2,3,"pl-v"],[45,46,"pl-s"],[46,81,"pl-c1"],[81,82,"pl-s"],[87,88,"pl-s"],[88,123,"pl-c1"],[123,124,"pl-s"]],[[2,3,"pl-v"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[38,39,"pl-s"],[39,58,"pl-c1"],[58,59,"pl-s"]],[[2,3,"pl-v"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,30,"pl-c1"],[30,31,"pl-s"]],[[2,3,"pl-v"],[11,12,"pl-s"],[12,23,"pl-c1"],[23,24,"pl-s"],[38,39,"pl-s"],[39,44,"pl-c1"],[44,45,"pl-s"],[47,48,"pl-s"],[48,52,"pl-c1"],[52,53,"pl-s"],[55,56,"pl-s"],[56,60,"pl-c1"],[60,61,"pl-s"],[63,64,"pl-s"],[64,69,"pl-c1"],[69,70,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,31,"pl-c1"],[31,32,"pl-s"],[43,44,"pl-s"],[44,45,"pl-c1"],[45,46,"pl-s"]],[[2,3,"pl-v"],[14,15,"pl-s"],[15,16,"pl-c1"],[16,17,"pl-s"],[26,27,"pl-s"],[27,39,"pl-c1"],[39,40,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,35,"pl-c1"],[35,36,"pl-s"],[47,48,"pl-s"],[48,49,"pl-c1"],[49,50,"pl-s"]],[[2,3,"pl-v"],[14,15,"pl-s"],[15,16,"pl-c1"],[16,17,"pl-s"]],[[2,3,"pl-v"],[7,8,"pl-s"],[8,14,"pl-c1"],[14,15,"pl-s"],[59,60,"pl-s"],[60,89,"pl-c1"],[89,90,"pl-s"]],[[2,3,"pl-v"],[7,8,"pl-s"],[8,12,"pl-c1"],[12,13,"pl-s"],[39,40,"pl-s"],[40,63,"pl-c1"],[63,64,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"],[27,28,"pl-s"],[28,29,"pl-c1"],[29,30,"pl-s"],[34,35,"pl-s"],[35,36,"pl-c1"],[36,37,"pl-s"],[48,49,"pl-s"],[49,50,"pl-c1"],[50,51,"pl-s"]],[[2,3,"pl-v"]],[],[[2,9,"pl-ent"]],[],[[0,17,"pl-mh"],[3,17,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"],[27,28,"pl-s"],[28,47,"pl-c1"],[47,48,"pl-s"],[62,63,"pl-s"],[63,101,"pl-c1"],[101,102,"pl-s"]],[[0,1,"pl-v"],[27,28,"pl-s"],[28,47,"pl-c1"],[47,48,"pl-s"],[62,63,"pl-s"],[63,101,"pl-c1"],[101,102,"pl-s"]],[[0,1,"pl-v"],[21,22,"pl-s"],[22,55,"pl-c1"],[55,56,"pl-s"],[64,65,"pl-s"],[65,98,"pl-c1"],[98,99,"pl-s"]],[[0,1,"pl-v"],[44,45,"pl-s"],[45,91,"pl-c1"],[91,92,"pl-s"],[131,132,"pl-s"],[132,165,"pl-c1"],[165,166,"pl-s"],[171,172,"pl-s"],[172,205,"pl-c1"],[205,206,"pl-s"],[266,267,"pl-s"],[267,289,"pl-c1"],[289,290,"pl-s"],[295,296,"pl-s"],[296,318,"pl-c1"],[318,319,"pl-s"]],[],[[65,66,"pl-s"],[66,97,"pl-c1"],[97,98,"pl-s"]],[],[[0,28,"pl-mh"],[3,28,"pl-en"]],[],[[0,1,"pl-v"]],[[2,3,"pl-v"]],[[2,3,"pl-v"],[26,27,"pl-s"],[27,35,"pl-c1"],[35,36,"pl-s"],[42,43,"pl-s"],[43,68,"pl-c1"],[68,69,"pl-s"]],[],[[0,1,"pl-v"]],[[2,3,"pl-v"]],[[4,5,"pl-v"],[6,7,"pl-s"],[7,42,"pl-c1"],[42,43,"pl-s"]],[[4,5,"pl-v"],[6,7,"pl-s"],[7,60,"pl-c1"],[60,61,"pl-s"]],[[2,3,"pl-v"],[55,56,"pl-s"],[56,102,"pl-c1"],[102,103,"pl-s"]],[],[[0,12,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[11,12,"pl-s"]],[[0,55,"pl-ent"],[0,2,"pl-ent"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,57,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-v"],[27,29,"pl-s"],[54,56,"pl-s"]],[[0,261,"pl-ent"],[0,2,"pl-ent"],[4,5,"pl-v"],[24,25,"pl-s"],[25,49,"pl-c1"],[49,50,"pl-s"]],[[0,214,"pl-ent"],[0,2,"pl-ent"],[4,5,"pl-v"],[170,171,"pl-s"],[171,212,"pl-c1"],[212,213,"pl-s"]],[[0,282,"pl-ent"],[0,2,"pl-ent"],[4,5,"pl-v"]],[[0,111,"pl-ent"],[0,2,"pl-ent"],[4,5,"pl-v"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,186,"pl-ent"],[0,2,"pl-ent"]],[[0,1,"pl-ent"],[0,1,"pl-ent"]],[[0,156,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-v"],[31,32,"pl-s"],[44,45,"pl-s"],[64,65,"pl-s"],[65,92,"pl-c1"],[92,93,"pl-s"],[98,99,"pl-s"],[99,126,"pl-c1"],[126,127,"pl-s"]],[[0,84,"pl-ent"],[0,2,"pl-ent"],[4,5,"pl-v"],[15,63,"pl-corl"]],[[0,101,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-v"]],[[0,142,"pl-ent"],[0,2,"pl-ent"],[4,5,"pl-v"],[15,63,"pl-corl"],[68,116,"pl-corl"]],[[0,0,"pl-ent"]],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[0,1,"pl-v"]],[[2,3,"pl-v"],[55,56,"pl-s"],[56,57,"pl-c1"],[57,58,"pl-s"]],[[2,3,"pl-v"],[15,16,"pl-s"],[16,23,"pl-c1"],[23,24,"pl-s"],[65,66,"pl-s"],[66,82,"pl-c1"],[82,83,"pl-s"],[96,97,"pl-s"],[97,113,"pl-c1"],[113,114,"pl-s"]],[[2,3,"pl-v"],[31,32,"pl-s"],[32,53,"pl-c1"],[53,54,"pl-s"],[71,72,"pl-s"],[72,101,"pl-c1"],[101,102,"pl-s"]],[[2,3,"pl-v"],[34,35,"pl-s"],[35,56,"pl-c1"],[56,57,"pl-s"],[74,75,"pl-s"],[75,104,"pl-c1"],[104,105,"pl-s"]],[[0,1,"pl-v"]],[[2,3,"pl-v"],[11,12,"pl-s"],[12,20,"pl-c1"],[20,21,"pl-s"],[28,29,"pl-s"],[29,33,"pl-c1"],[33,34,"pl-s"]],[[2,3,"pl-v"],[67,68,"pl-s"],[68,97,"pl-c1"],[97,98,"pl-s"]],[[2,3,"pl-v"],[20,21,"pl-s"],[21,54,"pl-c1"],[54,55,"pl-s"],[60,61,"pl-s"],[61,91,"pl-c1"],[91,92,"pl-s"]],[],[[0,10,"pl-mh"],[3,10,"pl-en"]],[],[[17,18,"pl-s"],[18,67,"pl-c1"],[67,68,"pl-s"]],[],[[0,9,"pl-mh"],[3,9,"pl-en"]],[[0,1,"pl-v"],[2,4,"pl-s"],[11,13,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[19,21,"pl-s"],[22,23,"pl-s"],[32,33,"pl-s"],[33,34,"pl-s"],[34,62,"pl-corl"],[62,63,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[14,16,"pl-s"],[17,18,"pl-s"],[18,20,"pl-s"],[35,36,"pl-s"],[36,37,"pl-s"],[37,101,"pl-corl"],[101,103,"pl-s"],[103,104,"pl-s"],[104,136,"pl-corl"],[136,137,"pl-s"]],[],[[86,87,"pl-s"],[104,105,"pl-s"],[105,106,"pl-s"],[106,158,"pl-corl"],[158,159,"pl-s"]],[],[[0,10,"pl-mh"],[3,10,"pl-en"]],[],[[56,57,"pl-s"],[64,65,"pl-s"],[65,66,"pl-s"],[66,73,"pl-corl"],[73,74,"pl-s"]],[],[[0,13,"pl-mh"],[3,13,"pl-en"]],[],[[107,108,"pl-s"],[108,109,"pl-c1"],[109,110,"pl-s"]],[[42,87,"pl-corl"]]],"colorizedLines":null}},"title":"Zsh-Opencode-Tab/README.md at main · alberti42/Zsh-Opencode-Tab","appPayload":{},"meta":{"title":"Zsh-Opencode-Tab/README.md at main · alberti42/Zsh-Opencode-Tab"}}</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="/alberti42/Zsh-Opencode-Tab" 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="/alberti42/Zsh-Opencode-Tab/tree/main" data-discover="true">Zsh-Opencode-Tab</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="/alberti42/Zsh-Opencode-Tab/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="/alberti42/Zsh-Opencode-Tab/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="21 KB" style="--truncate-max-width:100%"><span>462 lines (347 loc) · 21 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="/alberti42/Zsh-Opencode-Tab/tree/main" data-discover="true">Zsh-Opencode-Tab</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="21 KB" style="--truncate-max-width:100%"><span>462 lines (347 loc) · 21 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/alberti42/Zsh-Opencode-Tab/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="https://private-user-images.githubusercontent.com/61808/543995330-5dae9c9f-5cfd-4b56-9037-aca644bf710a.gif?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTUzMzAtNWRhZTljOWYtNWNmZC00YjU2LTkwMzctYWNhNjQ0YmY3MTBhLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRlNzRkZDEwZjFiNGIyODg4NzAxY2JkMjU2MzhlZDQ2ZjlmYzk4YjAwZjhmMjAzZDYzNWVlYWJhYzE3ZWUxODkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRmdpZiJ9.UkAErg6xX7-SkWeloBPVIUnfPJs9OlMmjVNrd63qLhk"><img src="https://private-user-images.githubusercontent.com/61808/543995330-5dae9c9f-5cfd-4b56-9037-aca644bf710a.gif?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTUzMzAtNWRhZTljOWYtNWNmZC00YjU2LTkwMzctYWNhNjQ0YmY3MTBhLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRlNzRkZDEwZjFiNGIyODg4NzAxY2JkMjU2MzhlZDQ2ZjlmYzk4YjAwZjhmMjAzZDYzNWVlYWJhYzE3ZWUxODkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRmdpZiJ9.UkAErg6xX7-SkWeloBPVIUnfPJs9OlMmjVNrd63qLhk" alt="A little AI magic in the terminal" data-animated-image="" style="max-width: 100%;"></a>
</p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">zsh-opencode-tab: a little AI magic in the terminal</h1><a id="user-content-zsh-opencode-tab-a-little-ai-magic-in-the-terminal" class="anchor" aria-label="Permalink: zsh-opencode-tab: a little AI magic in the terminal" href="#zsh-opencode-tab-a-little-ai-magic-in-the-terminal"><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">Turn a comment into a command by pressing TAB.</p>
<p dir="auto">It feels like talking to your terminal.
You type what you want as a quick note to yourself, hit TAB, and your prompt fills with a real command you can review.
Sometimes you tweak it. Sometimes you just run it.
Either way, you stay in control.</p>
<p dir="auto">This is a zsh plugin, and it plays nicely with Oh My Zsh.
Most importantly: it keeps your normal TAB completion. It only steps in when you ask for it.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Quick Look</h2><a id="user-content-quick-look" class="anchor" aria-label="Permalink: Quick Look" href="#quick-look"><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">Type a comment and press TAB:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# list commits between 869b1373 and f1b8edd0, oldest first"><pre><span class="pl-c"><span class="pl-c">#</span> list commits between 869b1373 and f1b8edd0, oldest first</span></pre></div>
<p dir="auto">After TAB, your prompt keeps your request and adds command(s) below:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# list commits between 869b1373 and f1b8edd0, oldest first
git rev-list --reverse 869b1373..f1b8edd0"><pre><span class="pl-c"><span class="pl-c">#</span> list commits between 869b1373 and f1b8edd0, oldest first</span>
git rev-list --reverse 869b1373..f1b8edd0</pre></div>
<p dir="auto">Safety line (worth repeating): it never runs anything.
It only inserts text into your prompt.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">How It Works (From A User's Point Of View)</h2><a id="user-content-how-it-works-from-a-users-point-of-view" class="anchor" aria-label="Permalink: How It Works (From A User's Point Of View)" href="#how-it-works-from-a-users-point-of-view"><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>If the current line starts with <code>#</code>, TAB treats it as a request and generates zsh command(s).</li>
<li>If it does not start with <code>#</code>, TAB behaves exactly like it did before.</li>
</ul>
<p dir="auto">Pick a prefix:</p>
<ul dir="auto">
<li><code># &lt;request&gt;&lt;TAB&gt;</code> generate command(s)</li>
<li><code>#? &lt;question&gt;&lt;TAB&gt;</code> explanation mode; prints an answer to your terminal (does not edit your prompt)</li>
</ul>
<p dir="auto">The persistence behavior is what makes iteration feel nice: keep your draft in the prompt and press TAB again.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Pro Tip: Iterate In Place</h2><a id="user-content-pro-tip-iterate-in-place" class="anchor" aria-label="Permalink: Pro Tip: Iterate In Place" href="#pro-tip-iterate-in-place"><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">When you use persistence, your prompt becomes a tiny scratchpad. You're not "chatting". You're drafting a command.</p>
<ul dir="auto">
<li>First TAB gets you a rough draft.</li>
<li>Next TAB is a revision pass: you tweak your notes (add another <code># ...</code> line, or edit an existing one) and press TAB again.</li>
<li>Because the old draft stays in the buffer, the agent can refine it instead of reinventing it.</li>
</ul>
<p dir="auto">That means you can do this:</p>
<ol dir="auto">
<li>Ask for a rough draft:</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# list all .py files under this folder, one per line&lt;TAB&gt;"><pre><span class="pl-c"><span class="pl-c">#</span> list all .py files under this folder, one per line&lt;TAB&gt;</span></pre></div>
<ol start="2" dir="auto">
<li>Refine the request and press TAB again (add another <code># ...</code> line anywhere you like):</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# but exclude files with _test_ in the filename&lt;TAB&gt;"><pre><span class="pl-c"><span class="pl-c">#</span> but exclude files with _test_ in the filename&lt;TAB&gt;</span></pre></div>
<ol start="3" dir="auto">
<li>Add the action you actually want:</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# now show line counts for each file and sort biggest first&lt;TAB&gt;"><pre><span class="pl-c"><span class="pl-c">#</span> now show line counts for each file and sort biggest first&lt;TAB&gt;</span></pre></div>
<p dir="auto">If you ever want to override the default behavior:</p>
<ul dir="auto">
<li>Use <code>#+</code> to force persistence for a single request.</li>
<li>Use <code>#-</code> to force a "commands only" reply (no echoed <code># ...</code> prompt lines).</li>
</ul>
<p dir="auto">You can keep iterating until it looks right, then run it.
Still safe: it never runs anything for you.</p>
<details>
<summary><strong>Click to expand the TLDR section on how it works internally</strong></summary>
<ul dir="auto">
<li>ZLE widget: intercepts TAB and triggers only on <code># ...</code> lines.</li>
<li>Controller (<code>src/controller.zsh</code>):
<ul dir="auto">
<li>starts the worker process</li>
<li>shows the Knight Rider spinner while the worker runs</li>
<li>updates <code>BUFFER</code> with the generated result on success</li>
</ul>
</li>
<li>Worker (<code>src/opencode_generate_command.py</code>):
<ul dir="auto">
<li>runs <code>opencode run --format json</code> and parses NDJSON events</li>
<li>returns <code>sessionID&lt;US&gt;repro_cmd&lt;US&gt;agent_reply</code> (US = ASCII Unit Separator, 0x1f) so the controller can split it</li>
</ul>
</li>
<li>Spinner (<code>src/spinner.zsh</code>): rendering-only; draws via <code>BUFFER</code> + <code>region_highlight</code>.</li>
</ul>
</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>
<ul dir="auto">
<li>zsh &gt;= 5.1</li>
<li><code>python3</code></li>
<li><code>opencode</code> CLI in <code>PATH</code></li>
<li>(Optional) an opencode server running on your machine or on your premises for attach/warm-start mode</li>
</ul>
<p dir="auto">Note: this plugin targets macOS and Linux. If you use Windows, run it under WSL.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Installation</h2><a id="user-content-installation" class="anchor" aria-label="Permalink: Installation" href="#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">Note: the <code>export</code> configurations shown below are just examples. For the full list, see <em>Configuration</em>.</p>
<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">If you use other plugins that customize TAB completion (especially <code>fzf-tab</code>), you have two options:</p>
<ol dir="auto">
<li>Load <code>zsh-opencode-tab</code> <strong>last</strong> (after <code>fzf-tab</code> and anything else that re-binds TAB).</li>
<li>Or keep TAB fully owned by your completion plugin and bind this plugin to another key via <code>Z_OC_TAB_BINDKEY</code>.</li>
</ol>
<details>
<summary><strong>Non-technical explanation (TL;DR)</strong></summary>
<p dir="auto">In zsh, a key press can only call one thing.</p>
<p dir="auto">This plugin respects what is already bound to the chosen key (<code>Z_OC_TAB_BINDKEY</code>): it steps in only when the prompt line begins with <code># ...</code>; in all other cases, it calls the original widget that was bound to that key.</p>
<p dir="auto">If another plugin grabs the same key <em>after</em> this one loads (common with <code>fzf-tab</code>), zsh will call that newer binding directly and this plugin will never see the key press.</p>
<p dir="auto">On this basis, we recommend option 1) because the binding of this plugin is triggered on a very specific criterion and is unlikely to interfere with any other plugins already installed on your system.</p>
</details>
</div>
<p dir="auto"><strong>Oh My Zsh:</strong></p>
<ol dir="auto">
<li>Clone this repo into your custom plugins directory:</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/alberti42/zsh-opencode-tab.git &quot;$ZSH_CUSTOM/plugins/zsh-opencode-tab&quot;"><pre>git clone https://github.com/alberti42/zsh-opencode-tab.git <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$ZSH_CUSTOM</span>/plugins/zsh-opencode-tab<span class="pl-pds">"</span></span></pre></div>
<ol start="2" dir="auto">
<li>Add it to your <code>.zshrc</code>:</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export \
	Z_OC_TAB_OPENCODE_MODEL=&quot;anthropic/claude-3-5-haiku-latest&quot; \
  Z_OC_TAB_EXPLAIN_PRINT_CMD='bat --plain --color=always --decorations=always --language=markdown --paging=never {}'

# IMPORTANT: keep this after plugins like fzf-tab that re-bind TAB.
plugins+=(zsh-opencode-tab)

# Alternative: bind to a different key (example: Ctrl-G) to avoid TAB conflicts.
# export Z_OC_TAB_BINDKEY='^G'"><pre><span class="pl-k">export</span> \
	Z_OC_TAB_OPENCODE_MODEL=<span class="pl-s"><span class="pl-pds">"</span>anthropic/claude-3-5-haiku-latest<span class="pl-pds">"</span></span> \
  Z_OC_TAB_EXPLAIN_PRINT_CMD=<span class="pl-s"><span class="pl-pds">'</span>bat --plain --color=always --decorations=always --language=markdown --paging=never {}<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> IMPORTANT: keep this after plugins like fzf-tab that re-bind TAB.</span>
plugins+=(zsh-opencode-tab)

<span class="pl-c"><span class="pl-c">#</span> Alternative: bind to a different key (example: Ctrl-G) to avoid TAB conflicts.</span>
<span class="pl-c"><span class="pl-c">#</span> export Z_OC_TAB_BINDKEY='^G'</span></pre></div>
<ol start="3" dir="auto">
<li>Reload your shell:</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="exec zsh"><pre><span class="pl-c1">exec</span> zsh</pre></div>
<p dir="auto"><strong>Do-it-yourself:</strong></p>
<ol dir="auto">
<li>
<p dir="auto">Clone this repo into your desired location (e.g., "$HOME/local/share/my-zsh-plugins")</p>
</li>
<li>
<p dir="auto">Source it from your <code>.zshrc</code>:</p>
</li>
</ol>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Z_OC_TAB_OPENCODE_MODEL=&quot;anthropic/claude-3-5-haiku-latest&quot;
# Optional: bind to a different key than TAB (example: Ctrl-G)
# export Z_OC_TAB_BINDKEY='^G'
source &quot;$HOME/local/share/my-zsh-plugins/zsh-opencode-tab/zsh-opencode-tab.plugin.zsh&quot;"><pre>Z_OC_TAB_OPENCODE_MODEL=<span class="pl-s"><span class="pl-pds">"</span>anthropic/claude-3-5-haiku-latest<span class="pl-pds">"</span></span>
<span class="pl-c"><span class="pl-c">#</span> Optional: bind to a different key than TAB (example: Ctrl-G)</span>
<span class="pl-c"><span class="pl-c">#</span> export Z_OC_TAB_BINDKEY='^G'</span>
<span class="pl-c1">source</span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$HOME</span>/local/share/my-zsh-plugins/zsh-opencode-tab/zsh-opencode-tab.plugin.zsh<span class="pl-pds">"</span></span></pre></div>
<p dir="auto"><strong>zinit:</strong></p>
<p dir="auto">Optional: if you want to bind this plugin to a different key than TAB, add e.g. <code>Z_OC_TAB_BINDKEY="^G"</code> to the <code>atinit</code> export list.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="zinit lucid wait depth=1 from'gh' compile for \
  wait'0c' atinit'export Z_OC_TAB_OPENCODE_MODEL=&quot;anthropic/claude-3-5-haiku-latest&quot; \
    Z_OC_TAB_SPINNER_BG_HEX=&quot;#24273A&quot; \
    Z_OC_TAB_OPENCODE_RUN_MODE=&quot;cold&quot; \
    Z_OC_TAB_EXPLAIN_PRINT_CMD=&quot;bat --plain --color=always --decorations=always --language markdown --paging=never {}&quot;' \
  @alberti42/zsh-opencode-tab"><pre>zinit lucid <span class="pl-c1">wait</span> depth=1 from<span class="pl-s"><span class="pl-pds">'</span>gh<span class="pl-pds">'</span></span> compile <span class="pl-k">for</span> \
  wait<span class="pl-s"><span class="pl-pds">'</span>0c<span class="pl-pds">'</span></span> atinit<span class="pl-s"><span class="pl-pds">'</span>export Z_OC_TAB_OPENCODE_MODEL="anthropic/claude-3-5-haiku-latest" \</span>
<span class="pl-s">    Z_OC_TAB_SPINNER_BG_HEX="#24273A" \</span>
<span class="pl-s">    Z_OC_TAB_OPENCODE_RUN_MODE="cold" \</span>
<span class="pl-s">    Z_OC_TAB_EXPLAIN_PRINT_CMD="bat --plain --color=always --decorations=always --language markdown --paging=never {}"<span class="pl-pds">'</span></span> \
  @alberti42/zsh-opencode-tab</pre></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Usage</h2><a id="user-content-usage" class="anchor" aria-label="Permalink: Usage" href="#usage"><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">Write a request preceded by <code>#</code> and press TAB (or your configured key via <code>Z_OC_TAB_BINDKEY</code>). The plugin updates your prompt with generated command(s), ready to edit/run.</p>
<ul dir="auto">
<li>If the line does not start with <code>#</code>, TAB behaves as usual (your original widget is preserved).</li>
<li>When you press TAB, the generator agent receives your whole prompt buffer (including any previous draft you kept there).
This is what makes iteration work: you can refine the request without losing context.</li>
<li>Magic prefixes:
<ul dir="auto">
<li><code># &lt;request&gt;&lt;TAB&gt;</code>: generate command(s).
<ul dir="auto">
<li>By default, your <code># ...</code> prompt stays in the buffer above the output.</li>
</ul>
</li>
<li><code>#? &lt;request&gt;&lt;TAB&gt;</code>: explanation mode; prints the explanation to the terminal via <code>Z_OC_TAB_EXPLAIN_PRINT_CMD</code> (default: <code>cat</code>).
<ul dir="auto">
<li>It does not insert the explanation into the buffer.</li>
<li>If you configure it to use <code>bat</code>, make sure <code>bat</code> is installed and in <code>PATH</code>.</li>
</ul>
</li>
<li>A prefix on its own, with no request after it (<code>#</code>, <code>#?</code>, <code>#+</code>, <code>#-</code>, optionally followed by spaces), is not sent anywhere: the key press is handed to whatever was bound to the trigger key before this plugin, so <kbd>TAB</kbd> still completes as usual.</li>
</ul>
</li>
</ul>
<p dir="auto">One small convention that makes iteration nice:</p>
<ul dir="auto">
<li>Lines that start with a single <code>#</code> are treated as <em>your</em> prompt notes.</li>
<li>If the agent needs to add notes, it uses <code>## ...</code> (double hash).
That makes it easy to tell what you wrote vs what the agent added.</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Mini Demo</h2><a id="user-content-mini-demo" class="anchor" aria-label="Permalink: Mini Demo" href="#mini-demo"><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">Type each request line (starting with <code>#</code>) and press TAB.
The plugin inserts text into your prompt so you can review it; it does not execute anything.</p>
<p dir="auto">Demo clip:</p>
<details open="" class="details-reset border rounded-2">
  <summary class="tmp-px-3 py-2">
    <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-device-camera-video">
    <path d="M16 3.75v8.5a.75.75 0 0 1-1.136.643L11 10.575v.675A1.75 1.75 0 0 1 9.25 13h-7.5A1.75 1.75 0 0 1 0 11.25v-6.5C0 3.784.784 3 1.75 3h7.5c.966 0 1.75.784 1.75 1.75v.675l3.864-2.318A.75.75 0 0 1 16 3.75Zm-6.5 1a.25.25 0 0 0-.25-.25h-7.5a.25.25 0 0 0-.25.25v6.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-6.5ZM11 8.825l3.5 2.1v-5.85l-3.5 2.1Z"></path>
</svg>
    <span class="m-1">zsh-opencode-tab-demo.mov</span>
    <span class="dropdown-caret"></span>
  </summary>

  <video src="https://private-user-images.githubusercontent.com/61808/543990178-50318e0b-f945-4058-b446-2a04abbc8142.mov?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTAxNzgtNTAzMThlMGItZjk0NS00MDU4LWI0NDYtMmEwNGFiYmM4MTQyLm1vdj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk0ZTJjNjIyMDdhYTk0YjAyNmVmM2ZjZGVhZTRmNjdjM2U5YjRlNjZiYjlkYzEzMGM3ZGFkOTJkY2Y0YjM1MWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT12aWRlbyUyRnF1aWNrdGltZSJ9.OrDe7VxjLt3fE9AM1RxVesqtPwp7gb5D2S2_--6erOY" data-canonical-src="https://private-user-images.githubusercontent.com/61808/543990178-50318e0b-f945-4058-b446-2a04abbc8142.mov?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE3MDU2NDgsIm5iZiI6MTc5MTcwNTM0OCwicGF0aCI6Ii82MTgwOC81NDM5OTAxNzgtNTAzMThlMGItZjk0NS00MDU4LWI0NDYtMmEwNGFiYmM4MTQyLm1vdj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDExVDA3NTU0OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk0ZTJjNjIyMDdhYTk0YjAyNmVmM2ZjZGVhZTRmNjdjM2U5YjRlNjZiYjlkYzEzMGM3ZGFkOTJkY2Y0YjM1MWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT12aWRlbyUyRnF1aWNrdGltZSJ9.OrDe7VxjLt3fE9AM1RxVesqtPwp7gb5D2S2_--6erOY" controls="controls" muted="muted" class="d-block rounded-bottom-2 border-top width-fit" style="max-height:640px; min-height: 200px">

  </video>
</details>

<p dir="auto"><b>Example:</b> list commits in a SHA range (in chronological order):</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# give me the git command to list (using rev-list) the commits between 869b1373 and f1b8edd0, oldest first
git rev-list --reverse 869b1373..f1b8edd0"><pre><span class="pl-c"><span class="pl-c">#</span> give me the git command to list (using rev-list) the commits between 869b1373 and f1b8edd0, oldest first</span>
git rev-list --reverse 869b1373..f1b8edd0</pre></div>
<p dir="auto"><b>Example:</b> iterate over <code>fd</code> results and print resolved paths:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# give me a for-loop to iterate over `fd -e zsh`; print the resolved path for each file
for file in $(fd -e zsh); do print &quot;$(realpath &quot;$file&quot;)&quot;; done"><pre><span class="pl-c"><span class="pl-c">#</span> give me a for-loop to iterate over `fd -e zsh`; print the resolved path for each file</span>
<span class="pl-k">for</span> <span class="pl-smi">file</span> <span class="pl-k">in</span> <span class="pl-s"><span class="pl-pds">$(</span>fd -e zsh<span class="pl-pds">)</span></span><span class="pl-k">;</span> <span class="pl-k">do</span> print <span class="pl-s"><span class="pl-pds">"</span><span class="pl-s"><span class="pl-pds">$(</span>realpath <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$file</span><span class="pl-pds">"</span></span><span class="pl-pds">)</span></span><span class="pl-pds">"</span></span><span class="pl-k">;</span> <span class="pl-k">done</span></pre></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Configuration</h2><a id="user-content-configuration" class="anchor" aria-label="Permalink: Configuration" href="#configuration"><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">All settings are resolved once when the plugin is loaded.
To change them, update your <code>.zshrc</code> and reload your shell (<code>exec zsh</code>).</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Common Settings</h3><a id="user-content-common-settings" class="anchor" aria-label="Permalink: Common Settings" href="#common-settings"><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 the best-looking "Knight Rider" fade effect, set the spinner background color to match your terminal background.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Default behavior for plain `# ...` requests.
# 1: keep the request line above the generated command(s) (default)
# 0: replace the buffer with generated command(s)
export Z_OC_TAB_PERSIST_DEFAULT='1'

# Backend server URL (optional).
# Used for:
# - attach mode (warm-start), if you want it
# - deleting sessions in attach mode (cold mode deletes locally)
export Z_OC_TAB_OPENCODE_BACKEND_URL=''

# How to run opencode:
# - cold (default): run `opencode run` locally (most reliable)
# - attach: run against the backend server (faster if your server is warm)
export Z_OC_TAB_OPENCODE_RUN_MODE='cold'

# Debug: bypass opencode and return a dummy reply immediately.
# Useful to iterate on UI/integration without making remote calls.
export Z_OC_TAB_OPENCODE_DUMMY=0
# Optional: what to insert into the prompt when dummy mode is enabled.
export Z_OC_TAB_OPENCODE_DUMMY_TEXT=&quot;echo 'hello from dummy mode'&quot;

# Speed (seconds per frame)
export Z_OC_TAB_SPINNER_INTERVAL='0.03'

# Message shown after the bar
export Z_OC_TAB_SPINNER_MESSAGE='Please wait for the agent ...'

# IMPORTANT: set this to your terminal background color.
# Tip: use a color picker / eyedropper to measure the hex color of your terminal background.
export Z_OC_TAB_SPINNER_BG_HEX='#24273A'

# Explanation mode output command (printed to the terminal).
# Use '{}' as the placeholder for the temporary file path.
export Z_OC_TAB_EXPLAIN_PRINT_CMD='bat --plain --color=always --decorations=always --language=markdown --paging=never {}'"><pre><span class="pl-c"><span class="pl-c">#</span> Default behavior for plain `# ...` requests.</span>
<span class="pl-c"><span class="pl-c">#</span> 1: keep the request line above the generated command(s) (default)</span>
<span class="pl-c"><span class="pl-c">#</span> 0: replace the buffer with generated command(s)</span>
<span class="pl-k">export</span> Z_OC_TAB_PERSIST_DEFAULT=<span class="pl-s"><span class="pl-pds">'</span>1<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> Backend server URL (optional).</span>
<span class="pl-c"><span class="pl-c">#</span> Used for:</span>
<span class="pl-c"><span class="pl-c">#</span> - attach mode (warm-start), if you want it</span>
<span class="pl-c"><span class="pl-c">#</span> - deleting sessions in attach mode (cold mode deletes locally)</span>
<span class="pl-k">export</span> Z_OC_TAB_OPENCODE_BACKEND_URL=<span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> How to run opencode:</span>
<span class="pl-c"><span class="pl-c">#</span> - cold (default): run `opencode run` locally (most reliable)</span>
<span class="pl-c"><span class="pl-c">#</span> - attach: run against the backend server (faster if your server is warm)</span>
<span class="pl-k">export</span> Z_OC_TAB_OPENCODE_RUN_MODE=<span class="pl-s"><span class="pl-pds">'</span>cold<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> Debug: bypass opencode and return a dummy reply immediately.</span>
<span class="pl-c"><span class="pl-c">#</span> Useful to iterate on UI/integration without making remote calls.</span>
<span class="pl-k">export</span> Z_OC_TAB_OPENCODE_DUMMY=0
<span class="pl-c"><span class="pl-c">#</span> Optional: what to insert into the prompt when dummy mode is enabled.</span>
<span class="pl-k">export</span> Z_OC_TAB_OPENCODE_DUMMY_TEXT=<span class="pl-s"><span class="pl-pds">"</span>echo 'hello from dummy mode'<span class="pl-pds">"</span></span>

<span class="pl-c"><span class="pl-c">#</span> Speed (seconds per frame)</span>
<span class="pl-k">export</span> Z_OC_TAB_SPINNER_INTERVAL=<span class="pl-s"><span class="pl-pds">'</span>0.03<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> Message shown after the bar</span>
<span class="pl-k">export</span> Z_OC_TAB_SPINNER_MESSAGE=<span class="pl-s"><span class="pl-pds">'</span>Please wait for the agent ...<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> IMPORTANT: set this to your terminal background color.</span>
<span class="pl-c"><span class="pl-c">#</span> Tip: use a color picker / eyedropper to measure the hex color of your terminal background.</span>
<span class="pl-k">export</span> Z_OC_TAB_SPINNER_BG_HEX=<span class="pl-s"><span class="pl-pds">'</span>#24273A<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> Explanation mode output command (printed to the terminal).</span>
<span class="pl-c"><span class="pl-c">#</span> Use '{}' as the placeholder for the temporary file path.</span>
<span class="pl-k">export</span> Z_OC_TAB_EXPLAIN_PRINT_CMD=<span class="pl-s"><span class="pl-pds">'</span>bat --plain --color=always --decorations=always --language=markdown --paging=never {}<span class="pl-pds">'</span></span></pre></div>
<p dir="auto">How to pick the right color:</p>
<ul dir="auto">
<li>Use any "eyedropper" / color picker tool, click your terminal background, and copy the hex value (like <code>#1e1e1e</code>).</li>
<li>On macOS, the built-in "Digital Color Meter" app can do this.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Advanced: All Customizable Settings</h3><a id="user-content-advanced-all-customizable-settings" class="anchor" aria-label="Permalink: Advanced: All Customizable Settings" href="#advanced-all-customizable-settings"><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">Most people never need these. They are here if you want to fine-tune the feel of the spinner (speed, colors, fading), or control how opencode is invoked (model, logging).</p>
<details>
<summary><strong>Click to expand the full list</strong></summary>
<p dir="auto">The plugin reads these environment variables at load time:</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Core</h4><a id="user-content-core" class="anchor" aria-label="Permalink: Core" href="#core"><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><code>Z_OC_TAB_DEBUG</code> (default: <code>0</code>)
<ul dir="auto">
<li>Enable debug behavior (internal).</li>
</ul>
</li>
<li><code>Z_OC_TAB_DEBUG_LOG</code> (default: <code>/tmp/zsh-opencode-tab.log</code>)
<ul dir="auto">
<li>Path to append debug logs to when <code>Z_OC_TAB_DEBUG=1</code>.</li>
</ul>
</li>
<li><code>Z_OC_TAB_BINDKEY</code> (default: <code>^I</code>)
<ul dir="auto">
<li>Which key sequence triggers this plugin (bindkey notation).</li>
<li>Default is TAB (i.e., <code>^I</code>). Example alternative: <code>^G</code> (Ctrl-G).</li>
<li>If another plugin re-binds TAB (e.g. <code>fzf-tab</code>), set this to a different key to avoid conflicts.</li>
</ul>
</li>
<li><code>Z_OC_TAB_PERSIST_DEFAULT</code> (default: <code>1</code>)
<ul dir="auto">
<li>Default persistence for plain <code># ...</code> requests.</li>
<li><code>1</code>: keep the request line above the generated output.</li>
<li><code>0</code>: replace the buffer with the generated output.</li>
</ul>
</li>
<li><code>Z_OC_TAB_EXPLAIN_PRINT_CMD</code> (default: <code>cat</code>)
<ul dir="auto">
<li>Command used to print <code>#?</code> explanation output to the terminal.</li>
<li>Use <code>{}</code> as a placeholder for the temporary file path.</li>
<li>Keep it simple: the value is split on spaces.</li>
</ul>
</li>
</ul>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Spinner</h4><a id="user-content-spinner" class="anchor" aria-label="Permalink: Spinner" href="#spinner"><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>
<p dir="auto"><code>Z_OC_TAB_SPINNER_MESSAGE</code> (default: <code>AI agent is busy ...</code>)</p>
<ul dir="auto">
<li>Message shown after the spinner bar.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_MESSAGE_FG</code> (default: empty)</p>
<ul dir="auto">
<li>Truecolor hex foreground for the message, e.g. <code>#cfcfcf</code>.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_HUE</code> (default: <code>280</code>)</p>
<ul dir="auto">
<li>Base hue (0..360).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_SATURATION</code> (default: <code>0.30</code>)</p>
<ul dir="auto">
<li>Base saturation (0..1).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_VALUE</code> (default: <code>1.0</code>)</p>
<ul dir="auto">
<li>Base brightness (0..1).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_INACTIVE_FACTOR</code> (default: <code>0.4</code>)</p>
<ul dir="auto">
<li>Dim factor for inactive dots (0..1). This is "alpha-like" via background blending.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_ENABLE_FADING</code> (default: <code>1</code>)</p>
<ul dir="auto">
<li>Enable global dot fading (1/0).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_MIN_ALPHA</code> (default: <code>0.0</code>)</p>
<ul dir="auto">
<li>Minimum fade factor for dots (0..1).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_BG_HEX</code> (default: <code>#24273A</code>)</p>
<ul dir="auto">
<li>Background used for blending and as the bar background. Set it to your terminal background for best results.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_INTERVAL</code> (default: <code>0.03</code>)</p>
<ul dir="auto">
<li>Seconds per frame (single speed knob).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_SPINNER_POLL_S</code> (default: <code>0.005</code>)</p>
<ul dir="auto">
<li>Poll interval (seconds) for reading the worker status FIFO.</li>
</ul>
</li>
</ul>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Opencode</h4><a id="user-content-opencode" class="anchor" aria-label="Permalink: Opencode" href="#opencode"><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>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_BACKEND_URL</code> (default: empty)</p>
<ul dir="auto">
<li>URL of your opencode server.</li>
<li>Used for attach mode.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_WORKDIR</code> (default: <code>$XDG_DATA_HOME/zsh-opencode-tab</code>)</p>
<ul dir="auto">
<li>Working directory used for the <code>opencode</code> subprocess.</li>
<li>If <code>XDG_DATA_HOME</code> is empty, it falls back to <code>${TMPDIR:-/tmp}/zsh-opencode-tab</code>.</li>
<li>The plugin keeps sessions in the global workspace (not inside whatever git repo you happen to be in).</li>
<li>The plugin writes its two bundled agents into <code>${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/</code>.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_RUN_MODE</code> (default: <code>cold</code>)</p>
<ul dir="auto">
<li><code>cold</code>: run <code>opencode run</code> locally (no server attach).</li>
<li><code>attach</code>: run <code>opencode run --attach &lt;backend_url&gt;</code>.</li>
<li>If you set <code>attach</code> but leave <code>Z_OC_TAB_OPENCODE_BACKEND_URL</code> empty, the plugin falls back to <code>cold</code> and shows a warning.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_MODEL</code> (default: empty)</p>
<ul dir="auto">
<li>Model in <code>provider/model</code> form.</li>
<li>Comprehensive list of providers/models: <a href="https://models.dev/" rel="nofollow">https://models.dev/</a></li>
<li>Recommended: first try the model in a regular <code>opencode</code> session (outside this plugin) to confirm your provider credentials are set up and your account has credits/billing to use it.</li>
<li>This sets the model for both generation and explanation.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_MODEL_GENERATOR</code> (default: empty)</p>
<ul dir="auto">
<li>Optional: model override for command generation.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_MODEL_EXPLAINER</code> (default: empty)</p>
<ul dir="auto">
<li>Optional: model override for explanation mode.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_AGENT_GENERATOR</code> (default: <code>shell_cmd_generator</code>)</p>
<ul dir="auto">
<li>Agent name for command generation.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_AGENT_EXPLAINER</code> (default: <code>shell_cmd_explainer</code>)</p>
<ul dir="auto">
<li>Agent name for explanation mode.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_VARIANT_GENERATOR</code> (default: empty)</p>
<ul dir="auto">
<li>Optional model variant for command generation, passed to opencode as <code>--variant</code>.</li>
<li>A variant is the provider-specific reasoning effort, e.g. <code>minimal</code>, <code>high</code>, <code>max</code>. The accepted values depend on the provider; the value is forwarded unchanged.</li>
<li>Generation emits a single shell command, and on a reasoning model the thinking phase dominates the response time. <code>minimal</code> is usually the right choice here.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_VARIANT_EXPLAINER</code> (default: empty)</p>
<ul dir="auto">
<li>Optional model variant for explanation mode.</li>
<li>Explanations are prose rather than one command, so a higher effort is easier to justify than it is for generation.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_VARIANT</code> (default: empty)</p>
<ul dir="auto">
<li><strong>Deprecated.</strong> Sets the variant for both generation and explanation.</li>
<li>Kept for backwards compatibility. Prefer <code>Z_OC_TAB_OPENCODE_VARIANT_GENERATOR</code> and <code>Z_OC_TAB_OPENCODE_VARIANT_EXPLAINER</code>, which let you spend reasoning effort where it pays off instead of applying one setting to two modes with different needs.</li>
<li>When set together with a per-mode variable, the per-mode variable wins.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_TITLE</code> (default: <code>zsh shell assistant</code>)</p>
<ul dir="auto">
<li>Session title.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_LOG_LEVEL</code> (default: empty)</p>
<ul dir="auto">
<li>Passes <code>--log-level</code> to opencode (<code>DEBUG</code>, <code>INFO</code>, <code>WARN</code>, <code>ERROR</code>).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_PRINT_LOGS</code> (default: <code>0</code>)</p>
<ul dir="auto">
<li>If set to <code>1</code>, passes <code>--print-logs</code>.</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_DELETE_SESSION</code> (default: <code>1</code>)</p>
<ul dir="auto">
<li>If set to <code>1</code>, deletes the created session after receiving the answer.</li>
<li>In <code>attach</code> mode: deletes via the server API (requires <code>Z_OC_TAB_OPENCODE_BACKEND_URL</code>), which costs no extra process because the server is already running.</li>
<li>In <code>cold</code> mode: deletes by running <code>opencode session delete</code> (no server needed).</li>
</ul>
</li>
<li>
<p dir="auto"><code>Z_OC_TAB_OPENCODE_GNU</code> (<code>0</code> or <code>1</code>; default: <code>1</code>)</p>
<ul dir="auto">
<li>Passed to the agent whether to prefer GNU tools over macOS/freeBSD.</li>
</ul>
</li>
</ul>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Agent + Prompt</h2><a id="user-content-agent--prompt" class="anchor" aria-label="Permalink: Agent + Prompt" href="#agent--prompt"><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 plugin bundles two agent definitions (prompt files) for opencode:</p>
<ul dir="auto">
<li>
<p dir="auto">One tuned for generating zsh command(s).</p>
</li>
<li>
<p dir="auto">One tuned for explaining commands and shell workflows.</p>
</li>
<li>
<p dir="auto">Default generator agent: <code>shell_cmd_generator</code> (definition: <code>opencode/agents/shell_cmd_generator.md</code>).</p>
</li>
<li>
<p dir="auto">Default explainer agent: <code>shell_cmd_explainer</code> (definition: <code>opencode/agents/shell_cmd_explainer.md</code>).</p>
</li>
<li>
<p dir="auto">Custom agents: set <code>Z_OC_TAB_OPENCODE_AGENT_GENERATOR</code> and/or <code>Z_OC_TAB_OPENCODE_AGENT_EXPLAINER</code>.</p>
</li>
<li>
<p dir="auto">Custom prompts: copy the agent file under <code>${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/</code> to a new filename and select it using <code>Z_OC_TAB_OPENCODE_AGENT_GENERATOR</code> and <code>Z_OC_TAB_OPENCODE_AGENT_EXPLAINER</code>. Note that the plugin overwrites its own bundled filenames <code>shell_cmd_generator.md</code> and <code>shell_cmd_explainer.md</code> to keep upgrades deterministic; thus, avoid modifying the bundled agents.</p>
</li>
</ul>
<p dir="auto">Tip: when you are iterating on the agent prompt, use cold start (<code>Z_OC_TAB_OPENCODE_RUN_MODE=cold</code>). It's the least confusing setup: you edit a file, reload your shell, and the next TAB uses it.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Cold Start vs Attach Mode</h2><a id="user-content-cold-start-vs-attach-mode" class="anchor" aria-label="Permalink: Cold Start vs Attach Mode" href="#cold-start-vs-attach-mode"><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>
<p dir="auto">Cold start (default): simplest and most reliable.</p>
<ul dir="auto">
<li>You do not run/attach to any server.</li>
<li>Each TAB request runs <code>opencode</code> from <code>Z_OC_TAB_OPENCODE_WORKDIR</code>, which keeps sessions in the global workspace.</li>
</ul>
</li>
<li>
<p dir="auto">Attach mode (optional): same experience, less startup overhead.</p>
<ul dir="auto">
<li>Run an opencode server and set:
<ul dir="auto">
<li><code>Z_OC_TAB_OPENCODE_RUN_MODE='attach'</code></li>
<li><code>Z_OC_TAB_OPENCODE_BACKEND_URL='http://127.0.0.1:4096'</code></li>
</ul>
</li>
<li>The plugin already keeps its two agent files under <code>${Z_OC_TAB_OPENCODE_WORKDIR}/.opencode/agents/</code>, and attach mode can use those too.</li>
</ul>
</li>
</ul>
<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">Known upstream rough edges (so you're not surprised):</p>
<ul dir="auto">
<li>Attach mode may return <strong>no answer for some models</strong>.
<ul dir="auto">
<li>Attach does work: <code>openai/gpt-5.4-mini-fast</code>, for instance, answers normally over a warm server. But some models return nothing on every request, and others are intermittent — the same model can succeed and then fail minutes later against the same server.</li>
<li>When it happens, the server runs the request correctly and stores the reply, but the attached client receives no text and exits successfully, so the plugin reports <code>opencode returned no output (empty reply)</code>.</li>
<li>Observed on opencode 1.18.18. We have not found the root cause, and the evidence points at opencode rather than at this plugin: the same request in cold start always works, and the answer that never reaches the client can be found afterwards in opencode's own session storage.</li>
<li>If you hit it, try another model before giving up on attach mode; cold start (the default) is unaffected.</li>
</ul>
</li>
</ul>
<p dir="auto">Two earlier attach-mode problems are now fixed upstream. They are listed here only so that anyone running an older opencode knows what to look for; the fix in both cases is to upgrade.</p>
<ul dir="auto">
<li>Attach mode used to ignore <em>which helper</em> you asked for, so <code>--agent shell_cmd_generator</code> and <code>--agent shell_cmd_explainer</code> had no effect over a server.
<ul dir="auto">
<li>Fixed by <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3886629914" data-permission-text="Title is private" data-url="https://github.com/anomalyco/opencode/issues/11812" data-hovercard-type="pull_request" data-hovercard-url="/anomalyco/opencode/pull/11812/hovercard" href="https://github.com/anomalyco/opencode/pull/11812">anomalyco/opencode#11812</a> (merged 2026-03-03).</li>
</ul>
</li>
<li>A password-protected server used to answer "Unauthorized" on attach even with the right password.
<ul dir="auto">
<li>Fixed by <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4371939318" data-permission-text="Title is private" data-url="https://github.com/anomalyco/opencode/issues/25596" data-hovercard-type="pull_request" data-hovercard-url="/anomalyco/opencode/pull/25596/hovercard" href="https://github.com/anomalyco/opencode/pull/25596">anomalyco/opencode#25596</a> and <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4372010728" data-permission-text="Title is private" data-url="https://github.com/anomalyco/opencode/issues/25600" data-hovercard-type="pull_request" data-hovercard-url="/anomalyco/opencode/pull/25600/hovercard" href="https://github.com/anomalyco/opencode/pull/25600">anomalyco/opencode#25600</a> (both merged 2026-05-03).</li>
</ul>
</li>
</ul>
</div>
<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>
<ul dir="auto">
<li>Nothing happens on TAB:
<ul dir="auto">
<li>The plugin only triggers when the line starts with <code>#</code>.</li>
<li>If you use <code>fzf-tab</code> (or any plugin that re-binds TAB), load <code>zsh-opencode-tab</code> last or set <code>Z_OC_TAB_BINDKEY</code> to another key.</li>
<li>Quick check (default TAB): <code>bindkey -M emacs '^I'</code> should point to <code>_zsh_opencode_tab_or_fallback</code>.</li>
<li>Quick check (example Ctrl-G): <code>bindkey -M emacs '^G'</code> should point to <code>_zsh_opencode_tab_or_fallback</code>.</li>
</ul>
</li>
<li>The spinner runs but the buffer does not change:
<ul dir="auto">
<li>Ensure <code>opencode</code> is in <code>PATH</code>.</li>
<li>If using attach mode, ensure the opencode server is running at <code>Z_OC_TAB_OPENCODE_BACKEND_URL</code>.</li>
<li>Temporarily set <code>Z_OC_TAB_OPENCODE_LOG_LEVEL=DEBUG</code> and <code>Z_OC_TAB_OPENCODE_PRINT_LOGS=1</code>.</li>
</ul>
</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Credits</h2><a id="user-content-credits" class="anchor" aria-label="Permalink: Credits" href="#credits"><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">Idea inspired by <code>https://github.com/verlihirsh/zsh-opencode-plugin</code>.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Author</h2><a id="user-content-author" class="anchor" aria-label="Permalink: Author" href="#author"><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>Author:</strong> Andrea Alberti</li>
<li><strong>GitHub Profile:</strong> <a href="https://github.com/alberti42">alberti42</a></li>
<li><strong>Donations:</strong> <a href="https://buymeacoffee.com/alberti" rel="nofollow"><img src="https://camo.githubusercontent.com/8ac3061cb2662e57a3c500a62a767a4bbf2ce869341a3fad60642e0c78c6cfd0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f6e6174652d4275792532304d6525323061253230436f666665652d6f72616e6765" alt="Buy Me a Coffee" data-canonical-src="https://img.shields.io/badge/Donate-Buy%20Me%20a%20Coffee-orange" style="max-width: 100%;"></a></li>
</ul>
<p dir="auto">Feel free to contribute to the development of this plugin or report any issues in the <a href="https://github.com/alberti42/Zsh-Opencode-Tab/issues">GitHub repository</a>.</p>
<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">This project is licensed under the MIT License. See the <a href="/alberti42/Zsh-Opencode-Tab/blob/main/LICENSE">LICENSE</a> file for details.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Gentle CTA</h2><a id="user-content-gentle-cta" class="anchor" aria-label="Permalink: Gentle CTA" href="#gentle-cta"><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 want to get a feel for it in 10 seconds: install it, open a new terminal, type a line starting with <code>#</code>, and press TAB.
If it clicks, consider starring the repo: <a href="https://github.com/alberti42/zsh-opencode-tab">https://github.com/alberti42/zsh-opencode-tab</a></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>

