> ## Documentation Index
> Fetch the complete documentation index at: https://felimet-hub.jmcores.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Appendix A: Settings Cheat Sheet Across Tools

> One-page reference: where to find personalization, project rules, privacy, memory, automation, and MCP settings for each major AI tool. Details in the corresponding units; this table just tells you where to look.

export const ToolCompare = ({lang = "zh", tools = [], dimensions = [], defaultSelected, notes = []}) => {
  const UI = lang === "en" ? {
    allTools: "All",
    recommend: "Recommended",
    noSupport: "N/A",
    minOneToolW: "Select at least one tool",
    mobileLabel: "Tool",
    dimensionLbl: "Dimension",
    notes: "Notes"
  } : {
    allTools: "全選",
    recommend: "推薦",
    noSupport: "無對應",
    minOneToolW: "至少選一個工具",
    mobileLabel: "工具",
    dimensionLbl: "維度",
    notes: "注意事項"
  };
  const ACCENT_L = "#bf7551";
  const ACCENT_D = "#cf8a68";
  const REC_BDR_L = "rgba(191,117,81,0.45)";
  const REC_BG_L = "rgba(191,117,81,0.06)";
  const REC_BDR_D = "rgba(207,138,104,0.45)";
  const REC_BG_D = "rgba(207,138,104,0.08)";
  const looksLikePath = val => typeof val === "string" && (/[/\\.*:]/).test(val);
  const safeTools = Array.isArray(tools) ? tools : [];
  const safeDimensions = Array.isArray(dimensions) ? dimensions : [];
  if (safeTools.length === 0 || safeDimensions.length === 0) return null;
  const allIds = safeTools.map(t => t.id);
  const initSelected = Array.isArray(defaultSelected) && defaultSelected.length > 0 ? defaultSelected.filter(id => allIds.includes(id)) : allIds;
  const [selectedIds, setSelectedIds] = useState(initSelected.length > 0 ? initSelected : allIds);
  const [expandedCell, setExpandedCell] = useState(null);
  const [mobileTool, setMobileTool] = useState(initSelected[0] || allIds[0]);
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const detect = () => setIsDark(document.documentElement.classList.contains("dark"));
    detect();
    const obs = new MutationObserver(detect);
    obs.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => obs.disconnect();
  }, []);
  const toggleTool = id => {
    setSelectedIds(prev => {
      const next = prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id];
      if (next.length === 0) return prev;
      if (expandedCell) {
        const [, cellToolId] = expandedCell.split(":");
        if (!next.includes(cellToolId)) setExpandedCell(null);
      }
      return next;
    });
  };
  const isAllSelected = selectedIds.length === allIds.length;
  const toggleAll = () => {
    if (isAllSelected) {
      setSelectedIds([allIds[0]]);
    } else {
      setSelectedIds(allIds);
    }
    setExpandedCell(null);
  };
  const visibleTools = safeTools.filter(t => selectedIds.includes(t.id));
  const cellKey = (dimId, toolId) => dimId + ":" + toolId;
  const toggleExpand = (dimId, toolId) => {
    const key = cellKey(dimId, toolId);
    setExpandedCell(prev => prev === key ? null : key);
  };
  const renderValue = cell => {
    if (cell.na) {
      return <span className="tc-na">{UI.noSupport}</span>;
    }
    const useMono = cell.mono === true || cell.mono !== false && looksLikePath(cell.value);
    return useMono ? <code className="tc-code">{cell.value}</code> : <span>{cell.value}</span>;
  };
  const css = `
  /* ── 根容器 ── */
  .tc-root {
    --tc-bg:           #FAF8F3;
    --tc-surface:      rgba(0,0,0,0.022);
    --tc-stripe:       rgba(0,0,0,0.028);
    --tc-border:       rgba(0,0,0,0.09);
    --tc-text:         #2b2722;
    --tc-dim:          #6f6a62;
    --tc-faint:        #8a8378;
    --tc-accent:       ${ACCENT_L};
    --tc-accent-bg:    ${REC_BG_L};
    --tc-accent-bdr:   ${REC_BDR_L};
    --tc-expand-bg:    rgba(0,0,0,0.016);
    --tc-code-bg:      rgba(0,0,0,0.055);
    --tc-na-color:     #9a9490;
    --tc-pill-on-bg:   rgba(191,117,81,0.10);
    --tc-pill-on-bdr:  rgba(191,117,81,0.35);
    --tc-pill-on-txt:  #a05c38;
    border: 1px solid var(--tc-border);
    border-radius: 14px;
    background: var(--tc-bg);
    color: var(--tc-text);
    overflow: hidden;
    font-size: 14px;
  }
  .dark .tc-root {
    --tc-bg:           #1b1a18;
    --tc-surface:      rgba(255,255,255,0.03);
    --tc-stripe:       rgba(255,255,255,0.025);
    --tc-border:       rgba(255,255,255,0.08);
    --tc-text:         #e7e3da;
    --tc-dim:          #a8a299;
    --tc-faint:        #706b64;
    --tc-accent:       ${ACCENT_D};
    --tc-accent-bg:    ${REC_BG_D};
    --tc-accent-bdr:   ${REC_BDR_D};
    --tc-expand-bg:    rgba(255,255,255,0.022);
    --tc-code-bg:      rgba(255,255,255,0.08);
    --tc-na-color:     #6e6b65;
    --tc-pill-on-bg:   rgba(207,138,104,0.12);
    --tc-pill-on-bdr:  rgba(207,138,104,0.35);
    --tc-pill-on-txt:  ${ACCENT_D};
  }

  /* ── 精簡篩選列 ── */
  .tc-filter-bar {
    display: flex;
    align-items: center;
    gap: 0;
    padding: 0 14px;
    border-bottom: 1px solid var(--tc-border);
    background: var(--tc-surface);
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
    /* 單行、不折行，高度由內容決定（約 36px） */
    flex-wrap: nowrap;
    white-space: nowrap;
    min-height: 36px;
  }
  .tc-filter-bar::-webkit-scrollbar { display: none; }

  /* 分隔竿（All 後面） */
  .tc-filter-sep {
    flex-shrink: 0;
    width: 1px;
    height: 14px;
    background: var(--tc-border);
    margin: 0 10px 0 6px;
    align-self: center;
  }

  /* pill 基底 — 極輕量文字標籤 */
  .tc-pill {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 5px 9px;
    border-radius: 5px;
    border: 1px solid transparent;
    background: transparent;
    color: var(--tc-faint);
    font: inherit;
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.01em;
    cursor: pointer;
    transition: color 0.12s, background 0.12s, border-color 0.12s;
    flex-shrink: 0;
    white-space: nowrap;
    /* 行高對齊 filter-bar */
    margin: 5px 1px;
  }
  .tc-pill:hover {
    color: var(--tc-text);
    background: rgba(0,0,0,0.04);
  }
  .dark .tc-pill:hover {
    background: rgba(255,255,255,0.05);
  }
  /* 選中態：細框 + 淡底 + 文字加深（非按鈕感，保持輕量） */
  .tc-pill-on {
    color: var(--tc-pill-on-txt);
    background: var(--tc-pill-on-bg);
    border-color: var(--tc-pill-on-bdr);
    font-weight: 600;
  }
  /* 全選 pill — 略小一點字型 */
  .tc-pill-all {
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    padding: 4px 8px;
    color: var(--tc-dim);
  }
  .tc-pill-all.tc-pill-on {
    color: var(--tc-pill-on-txt);
  }
  /* 選中小圓點 */
  .tc-pill-dot {
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: var(--tc-accent);
    flex-shrink: 0;
  }

  /* ── 桌面表格 ── */
  .tc-table-wrap {
    overflow: hidden;
  }
  /* Mintlify 的 MDX 渲染器會自動把 <table> 包進 data-table-wrapper：
   * 加 -mx-[var(--page-padding)] 負邊距 + w-[calc(100%+padding*2)] 全寬 + py-[1em]，
   * 讓表格往外溢出，撐破 tc-root 的圓角容器（2026-06-12 線上實證跑版）。
   * 中和它：邊距歸零、寬度收回 100%、把橫向捲動容器設在這層（sticky 左欄靠它）。 */
  .tc-root [data-table-wrapper] {
    margin: 0 !important;
    width: 100% !important;
    max-width: 100% !important;
    padding: 0 !important;
    overflow-x: auto;
    contain: none !important;
  }
  .tc-root [data-table-wrapper] > div {
    padding: 0 !important;
    margin: 0 !important;
  }
  .tc-root [data-table-wrapper]::-webkit-scrollbar { height: 4px; }
  .tc-root [data-table-wrapper]::-webkit-scrollbar-thumb { background: var(--tc-border); border-radius: 2px; }
  .tc-table {
    width: 100%;
    border-collapse: collapse;
    margin: 0 !important;
  }

  /* 表頭 */
  .tc-thead th {
    padding: 9px 15px;
    text-align: left;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--tc-faint);
    border-bottom: 2px solid var(--tc-border);
    background: var(--tc-surface);
    white-space: nowrap;
  }
  /* 維度欄（sticky 左欄） */
  .tc-thead th:first-child,
  .tc-td-dim {
    position: sticky;
    left: 0;
    z-index: 1;
  }
  .tc-thead th:first-child {
    width: 160px;
    min-width: 130px;
    background: var(--tc-surface);
    border-right: 1px solid var(--tc-border);
    z-index: 2;
  }

  /* 維度標籤欄 */
  .tc-td-dim {
    padding: 13px 15px;
    font-size: 12.5px;
    font-weight: 700;
    color: var(--tc-dim);
    vertical-align: middle;
    white-space: nowrap;
    border-bottom: 1px solid var(--tc-border);
    border-right: 1px solid var(--tc-border);
    background: var(--tc-surface);
  }

  /* 斑馬紋：奇數維度列 */
  .tc-row-even .tc-td-dim,
  .tc-row-even .tc-td {
    background-color: var(--tc-stripe);
  }
  .tc-row-even .tc-td-dim {
    background: color-mix(in srgb, var(--tc-surface) 70%, var(--tc-stripe) 30%);
  }

  /* 資料儲存格 */
  .tc-td {
    padding: 0;
    border-bottom: 1px solid var(--tc-border);
    border-left: 1px solid var(--tc-border);
    vertical-align: top;
    min-width: 150px;
  }
  .tc-td-inner {
    display: flex;
    flex-direction: column;
  }

  /* 主值行（可點擊） */
  .tc-cell-btn {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    width: 100%;
    text-align: left;
    background: transparent;
    border: none;
    padding: 13px 15px;
    color: inherit;
    font: inherit;
    font-size: 13px;
    line-height: 1.5;
    cursor: pointer;
    transition: background 0.11s;
    -webkit-tap-highlight-color: transparent;
  }
  .tc-cell-btn:hover {
    background: rgba(0,0,0,0.03);
  }
  .dark .tc-cell-btn:hover {
    background: rgba(255,255,255,0.03);
  }
  .tc-cell-btn-on {
    background: var(--tc-expand-bg);
  }

  /* 推薦標記：左 3px accent 邊框 + 淡底 */
  .tc-td-recommend {
    border-left: 3px solid var(--tc-accent-bdr);
    background: var(--tc-accent-bg);
  }
  .tc-td-recommend .tc-cell-btn:hover {
    background: rgba(191,117,81,0.05);
  }

  /* recommend 角標：超小 badge */
  .tc-rec-badge {
    flex-shrink: 0;
    margin-top: 1px;
    font-size: 9px;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--tc-accent);
    border: 1px solid var(--tc-accent-bdr);
    border-radius: 3px;
    padding: 1px 4px;
    white-space: nowrap;
    opacity: 0.85;
  }

  /* na 樣式 */
  .tc-na {
    font-style: italic;
    color: var(--tc-na-color);
    font-size: 12.5px;
    opacity: 0.7;
  }

  /* 等寬值 */
  .tc-code {
    font-family: "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
    font-size: 12px;
    background: var(--tc-code-bg);
    border-radius: 3px;
    padding: 1px 4px;
    word-break: break-all;
  }

  /* 展開詳情列 */
  .tc-detail-row td {
    padding: 0;
    border-bottom: 1px solid var(--tc-border);
  }
  .tc-detail-cell {
    padding: 10px 15px 12px;
    font-size: 12.5px;
    line-height: 1.65;
    color: var(--tc-dim);
    background: var(--tc-expand-bg);
    border-top: 1px dashed var(--tc-border);
    border-left: 1px solid var(--tc-border);
  }
  .tc-detail-cell:first-child {
    border-left: none;
    font-weight: 700;
    color: var(--tc-faint);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    vertical-align: top;
    padding-top: 12px;
    background: var(--tc-surface);
    white-space: nowrap;
    width: 160px;
  }
  .tc-detail-recommend {
    border-left: 3px solid var(--tc-accent-bdr) !important;
    background: var(--tc-accent-bg) !important;
  }

  /* 展開箭頭 */
  .tc-chevron {
    flex-shrink: 0;
    margin-top: 3px;
    opacity: 0.35;
    transition: transform 0.14s, opacity 0.14s;
  }
  .tc-chevron-open {
    transform: rotate(90deg);
    opacity: 0.65;
  }

  /* ── 注腳 ── */
  .tc-notes {
    border-top: 1px solid var(--tc-border);
    padding: 10px 16px 12px;
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  .tc-notes-label {
    font-size: 10.5px;
    font-weight: 700;
    letter-spacing: 0.07em;
    text-transform: uppercase;
    color: var(--tc-faint);
    margin-bottom: 3px;
  }
  .tc-note-item {
    font-size: 12.5px;
    color: var(--tc-dim);
    line-height: 1.55;
    padding-left: 14px;
    position: relative;
  }
  .tc-note-item::before {
    content: "*";
    position: absolute;
    left: 2px;
    color: var(--tc-faint);
  }

  /* ── 手機模式 ─────────────────────────────────────────── */
  .tc-mobile { display: none; }
  @media (max-width: 700px) {
    .tc-filter-bar { display: none; }
    .tc-table-wrap  { display: none; }
    .tc-mobile      { display: block; }

    .tc-mob-tabs {
      display: flex;
      overflow-x: auto;
      border-bottom: 1px solid var(--tc-border);
      -webkit-overflow-scrolling: touch;
      scrollbar-width: none;
    }
    .tc-mob-tabs::-webkit-scrollbar { display: none; }
    .tc-mob-tab {
      flex: 1 0 auto;
      padding: 10px 16px;
      background: transparent;
      border: none;
      border-bottom: 2px solid transparent;
      color: var(--tc-dim);
      font: inherit;
      font-size: 13px;
      font-weight: 500;
      cursor: pointer;
      white-space: nowrap;
      transition: color 0.12s, border-color 0.12s;
    }
    .tc-mob-tab-on {
      color: var(--tc-accent);
      border-bottom-color: var(--tc-accent);
      font-weight: 700;
    }
    .tc-mob-cards {
      padding: 12px 0 4px;
    }
    .tc-mob-card {
      border-bottom: 1px solid var(--tc-border);
      padding: 12px 16px;
    }
    .tc-mob-card:last-child { border-bottom: none; }
    .tc-mob-dim {
      font-size: 11px;
      font-weight: 700;
      letter-spacing: 0.05em;
      text-transform: uppercase;
      color: var(--tc-faint);
      margin-bottom: 6px;
    }
    .tc-mob-val {
      font-size: 13.5px;
      line-height: 1.55;
    }
    .tc-mob-rec {
      display: inline-block;
      margin-top: 6px;
      font-size: 9.5px;
      font-weight: 700;
      letter-spacing: 0.05em;
      text-transform: uppercase;
      color: var(--tc-accent);
      border: 1px solid var(--tc-accent-bdr);
      border-radius: 3px;
      padding: 1px 5px;
    }
    .tc-mob-detail {
      margin-top: 7px;
      font-size: 12.5px;
      line-height: 1.65;
      color: var(--tc-dim);
    }
    .tc-notes { padding: 11px 16px 13px; }
  }
  `;
  const renderDesktopTable = () => <div className="tc-table-wrap">
      <table className="tc-table">
        <thead className="tc-thead">
          <tr>
            <th>{UI.dimensionLbl}</th>
            {visibleTools.map(tool => <th key={tool.id}>{tool.label}</th>)}
          </tr>
        </thead>
        <tbody>
          {}
          {safeDimensions.flatMap((dim, dimIdx) => {
    const isAnyExpanded = visibleTools.some(t => expandedCell === cellKey(dim.id, t.id));
    const stripeClass = dimIdx % 2 === 1 ? " tc-row-even" : "";
    const rows = [];
    rows.push(<tr key={dim.id} className={"tc-row" + stripeClass}>
                <td className="tc-td-dim">{dim.label}</td>
                {visibleTools.map(tool => {
      const cell = (dim.cells || ({}))[tool.id] || ({});
      const key = cellKey(dim.id, tool.id);
      const isOpen = expandedCell === key;
      const hasDetail = !!cell.detail;
      const isRec = !!cell.recommend;
      return <td key={tool.id} className={"tc-td" + (isRec ? " tc-td-recommend" : "")}>
                      <div className="tc-td-inner">
                        <button type="button" className={"tc-cell-btn" + (isOpen ? " tc-cell-btn-on" : "")} onClick={hasDetail ? () => toggleExpand(dim.id, tool.id) : undefined} style={hasDetail ? {} : {
        cursor: "default"
      }} aria-expanded={hasDetail ? String(isOpen) : undefined}>
                          <span style={{
        flex: "1 1 0",
        minWidth: 0
      }}>
                            {renderValue(cell)}
                          </span>
                          {isRec && <span className="tc-rec-badge">{UI.recommend}</span>}
                          {hasDetail && <svg className={"tc-chevron" + (isOpen ? " tc-chevron-open" : "")} width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
                              <polyline points="9 18 15 12 9 6" />
                            </svg>}
                        </button>
                      </div>
                    </td>;
    })}
              </tr>);
    if (isAnyExpanded) {
      const openToolId = visibleTools.find(t => expandedCell === cellKey(dim.id, t.id))?.id;
      const openCell = openToolId ? (dim.cells || ({}))[openToolId] || ({}) : {};
      if (openCell.detail) {
        const openTool = safeTools.find(t => t.id === openToolId);
        const isRec = !!openCell.recommend;
        rows.push(<tr key={dim.id + "-detail"} className="tc-detail-row">
                    <td className="tc-detail-cell">
                      {openTool ? openTool.label : ""}
                    </td>
                    <td colSpan={visibleTools.length} className={"tc-detail-cell" + (isRec ? " tc-detail-recommend" : "")}>
                      {openCell.detail}
                    </td>
                  </tr>);
      }
    }
    return rows;
  })}
        </tbody>
      </table>
    </div>;
  const renderMobile = () => {
    const activeTool = safeTools.find(t => t.id === mobileTool) || safeTools[0];
    return <div className="tc-mobile">
        <div className="tc-mob-tabs" role="tablist">
          {safeTools.map(tool => <button key={tool.id} type="button" role="tab" aria-selected={tool.id === mobileTool ? "true" : "false"} className={"tc-mob-tab" + (tool.id === mobileTool ? " tc-mob-tab-on" : "")} onClick={() => setMobileTool(tool.id)}>
              {tool.label}
            </button>)}
        </div>

        <div className="tc-mob-cards">
          {safeDimensions.map(dim => {
      const cell = (dim.cells || ({}))[activeTool.id] || ({});
      const isRec = !!cell.recommend;
      return <div key={dim.id} className="tc-mob-card">
                <div className="tc-mob-dim">{dim.label}</div>
                <div className="tc-mob-val">{renderValue(cell)}</div>
                {isRec && <div className="tc-mob-rec">{UI.recommend}</div>}
                {cell.detail && <div className="tc-mob-detail">{cell.detail}</div>}
              </div>;
    })}
        </div>
      </div>;
  };
  return <div className="tc-root">
      <style>{css}</style>

      {}
      <div className="tc-filter-bar">
        <button type="button" className={"tc-pill tc-pill-all" + (isAllSelected ? " tc-pill-on" : "")} onClick={toggleAll} aria-pressed={String(isAllSelected)}>
          {UI.allTools}
        </button>

        {}
        <span className="tc-filter-sep" aria-hidden="true" />

        {safeTools.map(tool => {
    const isOn = selectedIds.includes(tool.id);
    return <button key={tool.id} type="button" className={"tc-pill" + (isOn ? " tc-pill-on" : "")} onClick={() => toggleTool(tool.id)} aria-pressed={String(isOn)}>
              {isOn && <span className="tc-pill-dot" aria-hidden="true" />}
              {tool.label}
            </button>;
  })}
      </div>

      {}
      {visibleTools.length > 0 && renderDesktopTable()}

      {}
      {renderMobile()}

      {}
      {notes.length > 0 && <div className="tc-notes">
          <div className="tc-notes-label">{UI.notes}</div>
          {notes.map((note, i) => <div key={i} className="tc-note-item">{note}</div>)}
        </div>}
    </div>;
};

<Info>
  This cheat sheet cross-references six configuration concepts across major AI tools: personalization instructions, project rules, memory, privacy opt-out, automation, and MCP. Details and sources are in the corresponding units; this table only tells you where each setting lives. Verified as of 2026-06; these tools update frequently, so confirm against current official documentation before acting.
</Info>

<Warning>
  Config file names and folder layouts change. The cheat sheet gives you an alignment framework, not a list you can copy verbatim forever.
</Warning>

## 1. How to read this table

Reading across a row shows where the same concept lives in different tools. Reading down a column shows all six configuration dimensions for one tool. The six concepts follow the layer model from [02-1 Configuration Layer Model](/en/code-agent/configuration/config-layer-model):

1. **Personalization (account-level instructions):** standing instructions for how the model talks to you.
2. **Project rules:** what the model should follow inside this repo.
3. **Memory:** what to remember across conversations.
4. **Privacy opt-out:** whether your conversations are used for training.
5. **Automation:** reusable commands, skills, and event hooks.
6. **MCP:** how external tools and data sources are connected.

When evaluating a new tool, work through these six dimensions: where is each one configured, and what is the default? Any cell you cannot fill in is a gap in your reading.

***

## 2. Personalization and project rules file locations

Windows paths use `C:\Users\<user>\`; macOS / Linux equivalent is `~`.

<ToolCompare
  lang="en"
  tools={[
{ id: "claude-code",    label: "Claude Code" },
{ id: "claude-web",     label: "Claude.ai (web)" },
{ id: "codex",          label: "OpenAI Codex" },
{ id: "chatgpt",        label: "ChatGPT" },
{ id: "antigravity",    label: "Google Antigravity" },
{ id: "copilot-cli",    label: "Copilot CLI" },
{ id: "cursor",         label: "Cursor" },
]}
  dimensions={[
{
  id: "personal",
  label: "Personalization (user level)",
  cells: {
    "claude-code":  { value: "~/.claude/CLAUDE.md, ~/.claude/settings.json", detail: "Multiple layers merged nearest-first; the user layer is the outermost baseline.", recommend: true },
    "claude-web":   { value: "Instructions for Claude (Settings)", detail: "Standing instructions entered on the Settings page; each Project overrides independently." },
    "codex":        { value: "~/.codex/AGENTS.md", detail: "Global project instructions, loaded only when trusted. Walks from git root down to cwd; closer files load later and override." },
    "chatgpt":      { value: "Custom Instructions", detail: "Entered on the settings page; each Project can override independently." },
    "antigravity":  { value: "~/.gemini/GEMINI.md", detail: "Global rules, used alongside AGENTS.md. Workspace .agents/rules/ adds workspace-level rules." },
    "copilot-cli":  { value: "~/.copilot/copilot-instructions.md", detail: "User-level instructions; .github/instructions/*.instructions.md supports path-scoping via frontmatter applyTo glob." },
    "cursor":       { value: "User Rules (GUI)", detail: "No corresponding user-level rules file; configured in the Cursor settings GUI." },
  },
},
{
  id: "project",
  label: "Project level",
  cells: {
    "claude-code":  { value: "./CLAUDE.md, .claude/rules/*.md", detail: "Files under rules/ can use frontmatter paths: glob for automatic path-scoped loading.", recommend: true },
    "claude-web":   { value: "Project instructions", detail: "Per-Project, entered via GUI; no file-based system." },
    "codex":        { value: "./AGENTS.md, .codex/config.toml", detail: "AGENTS.md is a cross-tool open standard; config.toml centralizes hooks / mcp_servers / agents configuration." },
    "chatgpt":      { value: "Projects instructions", detail: "Per-Project via GUI; no file-based system." },
    "antigravity":  { value: "./GEMINI.md, ./AGENTS.md, .agents/rules/*.md", detail: "Plural rules/ is the official default; singular compatible with older versions. Known conflict when both Gemini CLI and Antigravity write to ~/.gemini/GEMINI.md." },
    "copilot-cli":  { value: ".github/copilot-instructions.md", detail: "User-level and project-level hooks/ are additive, not overriding." },
    "cursor":       { value: ".cursor/rules/*.mdc, AGENTS.md", detail: "Only .mdc files are read; .md is silently ignored." },
  },
},
{
  id: "path-scoping",
  label: "Path-scoping rules",
  cells: {
    "claude-code":  { value: "frontmatter paths: glob", detail: "A rules file with paths: [\"src/**/*.ts\"] in its frontmatter is loaded only when matching files are touched, reducing context occupancy." },
    "claude-web":   { value: "Each Project is independent", detail: "Projects are fully isolated; no cross-Project path rules." },
    "codex":        { value: "Nearest-to-cwd wins", detail: "Walks from git root to cwd; files closer to cwd override files further out." },
    "chatgpt":      { value: "Each Project is independent", detail: "Projects do not affect each other." },
    "antigravity":  { value: "Global + workspace .agents/rules/", detail: "Global ~/.gemini/config/ and workspace .agents/rules/ are used together; no fine-grained glob binding." },
    "copilot-cli":  { value: "applyTo glob (frontmatter)", detail: ".github/instructions/*.instructions.md uses frontmatter applyTo for path-level glob control." },
    "cursor":       { value: ".mdc files only; .md ignored", detail: "Rules files must be .mdc format; .md is silently skipped. A common misconfiguration trap." },
  },
},
{
  id: "privacy",
  label: "Privacy opt-out",
  cells: {
    "claude-code":  { value: "Account-level Help Improve Claude", detail: "Shared with the Claude.ai account; Team / Enterprise is governed by commercial terms and does not train by default." },
    "claude-web":   { value: "Settings -> Privacy -> Help improve Claude", detail: "Free plan defaults to on; must manually turn off. Temporary Chat for one-off sensitive content." },
    "codex":        { value: "Data Controls training toggle", detail: "Set in OpenAI account Settings -> Data Controls." },
    "chatgpt":      { value: "Settings -> Data Controls -> Improve the model for everyone", detail: "Free / Plus plans default to on. Temporary Chat for one-off isolation." },
    "antigravity":  { value: "Enable Telemetry (Settings -> Account)", detail: "Workspace version is controlled by the administrator." },
    "copilot-cli":  { value: "Account / enterprise settings", detail: "Enterprise accounts default to no training; personal accounts follow account settings." },
    "cursor":       { value: "Account Privacy settings", detail: "Privacy Mode varies by version; confirm against official documentation." },
  },
},
]}
  notes={[
"Cursor's two ignore files: .cursorignore blocks AI access entirely; .cursorindexingignore only excludes indexing while the file remains readable. Putting secrets in the wrong file gives you a false sense of protection.",
"Google Antigravity: both Gemini CLI and Antigravity write to ~/.gemini/GEMINI.md, a known conflict (see 02-6 Section 3 warning).",
]}
/>

***

## 3. Memory locations

<ToolCompare
  lang="en"
  tools={[
{ id: "claude-code",   label: "Claude Code" },
{ id: "claude-web",    label: "Claude.ai" },
{ id: "chatgpt",       label: "ChatGPT" },
{ id: "gemini",        label: "Gemini" },
{ id: "codex",         label: "Codex" },
{ id: "antigravity",   label: "Antigravity" },
{ id: "copilot-cli",   label: "Copilot CLI" },
{ id: "cursor",        label: "Cursor" },
]}
  dimensions={[
{
  id: "mem-file",
  label: "Memory file / mechanism",
  cells: {
    "claude-code":  { value: "~/.claude/projects/<repo>/memory/ + auto-summarized MEMORY.md", detail: "Accumulates automatically per repo; snippets changes require dev restart (HMR does not reload them).", recommend: true },
    "claude-web":   { value: "Project conversations + non-Project conversations maintained separately", detail: "Account-side; managed at Settings -> Memory." },
    "chatgpt":      { value: "Saved Memories (viewable and deletable per entry) + Reference chat history", detail: "Account-side; Projects can isolate. Managed at Settings -> Personalization -> Manage memories." },
    "gemini":       { value: "Personal context -> Memory", detail: "Account-side. Managed at Settings -> Personal context -> Memory." },
    "codex":        { value: "No dedicated memory; AGENTS.md as substitute", detail: "Standing instructions replace memory; no dynamic cross-conversation memory mechanism.", na: false },
    "antigravity":  { value: "Memory (account-side)", detail: "Managed in account settings." },
    "copilot-cli":  { value: "No dedicated memory; instruction files as substitute", detail: "~/.copilot/ instruction files substitute; no dynamic memory mechanism.", na: false },
    "cursor":       { value: "No dedicated memory; .cursor/rules/*.mdc as substitute", detail: "Rules files substitute; no cross-conversation memory mechanism.", na: false },
  },
},
{
  id: "mem-scope",
  label: "Scope",
  cells: {
    "claude-code":  { value: "Per-repo, accumulates automatically", recommend: true },
    "claude-web":   { value: "Account-side" },
    "chatgpt":      { value: "Account-side; Projects can isolate" },
    "gemini":       { value: "Account-side" },
    "codex":        { value: "Project layer" },
    "antigravity":  { value: "Account-side" },
    "copilot-cli":  { value: "Primarily project layer" },
    "cursor":       { value: "Project layer" },
  },
},
{
  id: "mem-disable",
  label: "How to disable",
  cells: {
    "claude-code":  { value: "Settings -> Memory, or instruct in CLAUDE.md not to write", recommend: true },
    "claude-web":   { value: "Settings -> Memory" },
    "chatgpt":      { value: "Settings -> Personalization -> Manage memories" },
    "gemini":       { value: "Settings -> Personal context -> Memory" },
    "codex":        { value: "Not applicable", na: true },
    "antigravity":  { value: "Account settings" },
    "copilot-cli":  { value: "Not applicable", na: true },
    "cursor":       { value: "Not applicable", na: true },
  },
},
]}
  notes={[
"Claude 'Memory,' ChatGPT 'Saved Memories,' and the others differ in when they trigger, whether entries can be deleted individually, and whether they are used for training. Alignment as a concept is fine; assuming identical semantics will cause you to misjudge both privacy and behavioral boundaries.",
]}
/>

***

## 4. Automation and integration locations

<ToolCompare
  lang="en"
  tools={[
{ id: "claude-code",   label: "Claude Code" },
{ id: "codex",         label: "OpenAI Codex" },
{ id: "chatgpt",       label: "ChatGPT" },
{ id: "gemini-c",      label: "Gemini (consumer)" },
{ id: "antigravity",   label: "Google Antigravity" },
{ id: "copilot-cli",   label: "Copilot CLI" },
{ id: "cursor",        label: "Cursor" },
]}
  dimensions={[
{
  id: "reusable",
  label: "Reusable workflows",
  cells: {
    "claude-code":  { value: ".claude/skills/<n>/SKILL.md", detail: "Progressive disclosure: the main file holds only essential entry points; expensive content goes in references/ and scripts/. How well the description is written determines whether the model auto-invokes it.", recommend: true },
    "codex":        { value: "prompts/*.md (custom commands)", detail: "config.toml manages hooks / agents / mcp_servers in one place." },
    "chatgpt":      { value: "Custom GPTs (Configure tab)", detail: "No file-based system; configured via GUI." },
    "gemini-c":     { value: "Gems", detail: "No file-based system; configured via GUI." },
    "antigravity":  { value: "Skills (IDE / CLI / workspace three paths)", detail: "IDE: ~/.gemini/config/skills/; CLI: ~/.gemini/antigravity-cli/skills/; workspace: .agents/skills/. Workflows created via IDE panel; on-disk path not listed in official docs." },
    "copilot-cli":  { value: "~/.copilot/skills/<n>/SKILL.md, .github/skills/<n>/SKILL.md", detail: "Skills can live at both user and project level; hooks/ are additive." },
    "cursor":       { value: ".cursor/rules/*.mdc", detail: "No separate skill mechanism; rules files substitute for reusable configuration." },
  },
},
{
  id: "hooks",
  label: "Event hooks",
  cells: {
    "claude-code":  { value: ".claude/settings.json hooks, standalone hooks.json", detail: "30 events as of 2026-06 (PreToolUse, PostToolUse, Stop, SessionStart, and others). exit 2 semantics equal rejecting the tool call.", recommend: true },
    "codex":        { value: "config.toml [hooks] (stable)", detail: "Stable status; managed in config.toml." },
    "chatgpt":      { value: "No file-based system", na: true },
    "gemini-c":     { value: "No file-based system", na: true },
    "antigravity":  { value: "hooks.json (.agents/ or ~/.gemini/config/)", detail: "Both paths are valid; confirm behavior against your installed version's official docs." },
    "copilot-cli":  { value: "~/.copilot/hooks/ + .github/hooks/ (additive)", detail: "User-level and project-level hooks both run together; the project layer does not replace the user layer. Before working in a shared repo, check which hooks your local setup will bring in." },
    "cursor":       { value: "No equivalent mechanism", na: true },
  },
},
{
  id: "subagents",
  label: "Sub-agents",
  cells: {
    "claude-code":  { value: ".claude/agents/*.md", detail: "Since v2.1: built-in (Explore, Plan, general-purpose) plus custom layers. isolation: worktree supports parallel subtasks without conflicts.", recommend: true },
    "codex":        { value: "config.toml [agents] (stable)", detail: "Stable status." },
    "chatgpt":      { value: "No file-based system", na: true },
    "gemini-c":     { value: "No file-based system", na: true },
    "antigravity":  { value: "AGENTS.md + .agents/", detail: "AGENTS.md and .agents/ are the primary sub-agent configuration." },
    "copilot-cli":  { value: "~/.copilot/agents/<n>.agent.md, .github/agents/<n>.agent.md", detail: "Both user and project level are supported." },
    "cursor":       { value: "No equivalent mechanism", na: true },
  },
},
{
  id: "mcp",
  label: "MCP config",
  cells: {
    "claude-code":  { value: ".mcp.json (project), ~/.claude.json (user)", detail: "Three scopes: local (personal, not shared), project (versioned, requires user approval), user (all personal projects).", recommend: true },
    "codex":        { value: "config.toml [mcp_servers.<id>]", detail: "Managed in config.toml." },
    "chatgpt":      { value: "Via Custom GPT Actions", detail: "No standard MCP; external APIs connected via Actions." },
    "gemini-c":     { value: "Via Extensions", detail: "No standard MCP; integrations via Extensions." },
    "antigravity":  { value: "~/.gemini/config/mcp_config.json (officially confirmed)", detail: "CLI workspace: .agents/mcp_config.json. Confirm paths against your installed version's official docs." },
    "copilot-cli":  { value: "~/.copilot/mcp-config.json, .mcp.json / .github/mcp.json / .vscode/mcp.json", detail: "Multiple paths; choose based on your use case (user level vs. project level)." },
    "cursor":       { value: ".cursor/mcp.json", detail: "Single config file; no multi-layer structure." },
  },
},
]}
  notes={[
"Copilot hooks are additive, not overriding: user-level ~/.copilot/hooks/ and project-level .github/hooks/ both run together. Before working in a shared repo, check which hooks your local setup will bring in.",
]}
/>

***

## 5. Privacy opt-out quick reference

<ToolCompare
  lang="en"
  tools={[
{ id: "claude-free",        label: "Claude.ai (Free)" },
{ id: "claude-team",        label: "Claude.ai (Team / Enterprise)" },
{ id: "claude-code-priv",   label: "Claude Code" },
{ id: "chatgpt-priv",       label: "ChatGPT" },
{ id: "gemini-priv",        label: "Gemini" },
{ id: "workspace-priv",     label: "Workspace (Gemini)" },
{ id: "copilot-priv",       label: "Copilot" },
{ id: "cursor-priv",        label: "Cursor" },
]}
  dimensions={[
{
  id: "toggle-location",
  label: "Toggle location (as of 2026-06)",
  cells: {
    "claude-free":       { value: "Settings -> Privacy -> Help improve Claude" },
    "claude-team":       { value: "Governed by commercial terms", detail: "Team / Enterprise terms directly cover this; no manual switch required." },
    "claude-code-priv":  { value: "Account-level Help Improve Claude", detail: "Shared with the Claude.ai account toggle." },
    "chatgpt-priv":      { value: "Settings -> Data Controls -> Improve the model for everyone" },
    "gemini-priv":       { value: "Settings -> Keep Activity", detail: "Defaults to on for users 18 and over." },
    "workspace-priv":    { value: "Administrator-controlled", detail: "Determined by org policy; individuals cannot set it independently." },
    "copilot-priv":      { value: "Account / enterprise settings", detail: "Enterprise accounts default to no training; personal accounts follow account settings." },
    "cursor-priv":       { value: "Account Privacy settings", detail: "Privacy Mode varies by version; confirm against official documentation." },
  },
},
{
  id: "default-val",
  label: "Default",
  cells: {
    "claude-free":       { value: "On (must manually turn off)", detail: "Free plan defaults to using conversations for training; you must actively opt out." },
    "claude-team":       { value: "No training (per terms)", recommend: true },
    "claude-code-priv":  { value: "Same as account level" },
    "chatgpt-priv":      { value: "On (must manually turn off)", detail: "Free / Plus plans default to on. Temporary Chat for one-off isolation." },
    "gemini-priv":       { value: "On (users 18+)" },
    "workspace-priv":    { value: "Determined by org policy" },
    "copilot-priv":      { value: "Enterprise accounts default to no training", recommend: true },
    "cursor-priv":       { value: "Depends on account type" },
  },
},
{
  id: "oneoff",
  label: "One-off handling",
  cells: {
    "claude-free":       { value: "Temporary Chat" },
    "claude-team":       { value: "Terms level" },
    "claude-code-priv":  { value: "Account level" },
    "chatgpt-priv":      { value: "Temporary Chat" },
    "gemini-priv":       { value: "Conversations after disabling" },
    "workspace-priv":    { value: "Not applicable", na: true },
    "copilot-priv":      { value: "Personal accounts follow account settings" },
    "cursor-priv":       { value: "Privacy Mode (version-dependent)" },
  },
},
]}
  notes={[
"Consumer plans (ChatGPT, Gemini Free) typically default to using conversations for model improvement; you have to opt out yourself. Do not assume enterprise defaults apply to personal accounts, or vice versa.",
]}
/>

***

## 6. Cross-tool rules baseline: `AGENTS.md`

`AGENTS.md` is an open standard for converging each tool's proprietary rules file into one (governed by the Agentic AI Foundation under the Linux Foundation). Adoption: Codex, Cursor, Copilot, Gemini CLI, Jules, Devin, Amp, VS Code, and over twenty other tools support it natively (as of 2026-06, adopted by more than sixty thousand open-source projects).

<ToolCompare
  lang="en"
  tools={[
{ id: "claude-code-ag",  label: "Claude Code" },
{ id: "codex-ag",        label: "OpenAI Codex" },
{ id: "antigravity-ag",  label: "Google Antigravity" },
{ id: "copilot-cli-ag",  label: "GitHub Copilot CLI" },
{ id: "cursor-ag",       label: "Cursor" },
]}
  dimensions={[
{
  id: "native-support",
  label: "Native support",
  cells: {
    "claude-code-ag": { value: "No (does not read AGENTS.md)", detail: "Import via @AGENTS.md syntax inside CLAUDE.md; up to 4 levels of recursion." },
    "codex-ag":       { value: "Yes", detail: "Reads root and all parent layers by default.", recommend: true },
    "antigravity-ag": { value: "Yes", detail: "Used alongside GEMINI.md.", recommend: true },
    "copilot-cli-ag": { value: "Yes", detail: "Root is primary; can serve as substitute for CLAUDE.md / GEMINI.md.", recommend: true },
    "cursor-ag":      { value: "Yes", detail: "Used alongside .cursor/rules/*.mdc.", recommend: true },
  },
},
{
  id: "share-method",
  label: "How to share",
  cells: {
    "claude-code-ag": { value: "Import via @AGENTS.md in CLAUDE.md", detail: "Add @AGENTS.md as a line in CLAUDE.md; expands up to 4 levels of recursion." },
    "codex-ag":       { value: "Reads root and all parent layers by default" },
    "antigravity-ag": { value: "Used alongside GEMINI.md" },
    "copilot-cli-ag": { value: "Root is primary; substitute for CLAUDE.md / GEMINI.md" },
    "cursor-ag":      { value: "Used alongside .cursor/rules/*.mdc" },
  },
},
]}
  notes={[
"AGENTS.md is a baseline, not a replacement. Decide which file is the baseline (usually AGENTS.md) and have the others point back to it. Duplicated content drifts; eventually every copy is half-wrong.",
]}
/>

***

## 7. Hands-on: 30-second alignment exercise

<Note>
  **Scenario: migrating a Claude setup to Codex**

  <Steps>
    <Step title="Fill in the six-concept table for your current Claude setup as the source of truth">
      * Personalization: `~/.claude/CLAUDE.md`
      * Project rules: `./CLAUDE.md`, `.claude/rules/`
      * Memory: auto-memory + `MEMORY.md`
      * Privacy opt-out: Help improve Claude toggle
      * Automation: skills / hooks / commands
      * MCP: `.mcp.json` (project), `~/.claude.json` (user)
    </Step>

    <Step title="Map each cell to Codex">
      * Personalization: `~/.codex/AGENTS.md`
      * Project rules: `./AGENTS.md`, `.codex/config.toml`
      * Privacy opt-out: Data Controls training toggle
      * Automation: `[hooks]` in `config.toml`, `prompts/*.md`, `[mcp_servers.<id>]`
      * MCP: same as automation
      * Memory: none dedicated; use `AGENTS.md` as substitute
    </Step>

    <Step title="Extract overlapping project rules into AGENTS.md so both tools share one source">
      Once you do this, you will find only two real differences: Codex centralizes configuration in `config.toml`, while Claude uses `settings.json`.
    </Step>
  </Steps>
</Note>

***

## 8. Corresponding units

* Layer model and six-concept framework: [02-1 Configuration Layer Model](/en/code-agent/configuration/config-layer-model)
* Claude three products (Chat, Cowork, Code) detail: [02-2 Anthropic Claude Setup](/en/code-agent/configuration/anthropic-claude-setup)
* Config file precedence and `settings.local.json`: [02-3 settings.json and settings.local.json](/en/code-agent/configuration/settings-json)
* What `~/.claude.json` stores: [02-4 claude.json](/en/code-agent/configuration/claude-json)
* Skills / Hooks / Subagents / Plugins overview: [02-5 Mechanism Overview](/en/code-agent/configuration/skills-hooks-subagents-plugins)
* Other four tools aligned: [02-6 Other Tools Comparison](/en/code-agent/configuration/other-tools-comparison)
* Privacy and security checklist: [Appendix B: Privacy and Security Settings Checklist](/en/code-agent/appendix/privacy-security-checklist)
* Evaluation resources: [03-2 Beyond GitHub Stars](/en/code-agent/judgment/beyond-github-stars), [03-3 Security, Privacy, and Supply Chain Risk](/en/code-agent/judgment/security-privacy-supply-chain)
* Extended resources and community: [Appendix D: Resources and Community List](/en/code-agent/appendix/resources)
