> ## 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.

# 附錄 A：各工具設定速查表

> 一頁速查：各工具的個人化、專案規則、隱私、記憶、自動化、MCP 設定位置。細節與出處見對應單元；此處只給「去哪裡設」。

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>
  本速查表以六個概念橫向對位各主流 AI 工具的設定落點：個人化指令、專案規則、記憶、隱私退出、自動化、MCP。細節與出處見各對應單元；此表只給「去哪裡設」。查證截至 2026-06；各工具改版頻繁，使用前以官方文件確認。
</Info>

<Warning>
  設定檔名與資料夾是會動的，速查表給的是對位框架，不是永久可照抄的清單。
</Warning>

## 1. 怎麼用這張表

打橫看是同一個概念在不同工具的落點，打直看是同一個工具在六個概念上的設定面。六個概念沿用 [02-1 設定的層級模型](/code-agent/configuration/config-layer-model) 的框架：

1. **個人化（account-level instructions）**：模型「怎麼跟你說話」的常駐指令。
2. **專案規則（project rules）**：在這個 repo 裡該守什麼。
3. **記憶**：跨對話要記住什麼。
4. **隱私退出**：你的對話會不會被拿去訓練。
5. **自動化**：可重用的指令、技能、事件掛鉤。
6. **MCP**：外部工具與資料源怎麼接進來。

拿一個新工具時，照這六格問自己：每格設在哪、預設是什麼。填不出來的格子，就是你還沒讀到的文件。

***

## 2. 個人化與專案規則

Windows 路徑以 `C:\Users\<user>\` 表示；macOS / Linux 對應 `~`。

<ToolCompare
  lang="zh"
  tools={[
{ id: "claude-code",    label: "Claude Code" },
{ id: "claude-web",     label: "Claude.ai 網頁版" },
{ 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: "個人化（使用者層）",
  cells: {
    "claude-code":  { value: "~/.claude/CLAUDE.md、~/.claude/settings.json", detail: "多層由近到遠疊加，使用者層為最外圍基線。", recommend: true },
    "claude-web":   { value: "Instructions for Claude（Settings）", detail: "在 Settings 頁面填入的常駐指令，每個 Project 獨立覆寫。" },
    "codex":        { value: "~/.codex/AGENTS.md", detail: "全域專案指令，trusted 才載入。從 git root 向下走到 cwd；越近越後覆寫前者。" },
    "chatgpt":      { value: "Custom Instructions", detail: "在設定頁填入；每個 Project 可獨立覆寫。" },
    "antigravity":  { value: "~/.gemini/GEMINI.md", detail: "全域規則，與 AGENTS.md 並用。工作區 .agents/rules/ 加工作區層規則。" },
    "copilot-cli":  { value: "~/.copilot/copilot-instructions.md", detail: "使用者層指令；.github/instructions/*.instructions.md 可以 frontmatter applyTo glob 做路徑級綁定。" },
    "cursor":       { value: "User Rules（圖形介面）", detail: "無對應的使用者層規則檔，在 Cursor 設定 GUI 填寫。" },
  },
},
{
  id: "project",
  label: "專案層",
  cells: {
    "claude-code":  { value: "./CLAUDE.md、.claude/rules/*.md", detail: "rules/ 下的 .md 檔可在 frontmatter 加 paths: glob 做路徑級自動載入。", recommend: true },
    "claude-web":   { value: "Project instructions", detail: "每個 Project 獨立，GUI 填寫，無檔案體系。" },
    "codex":        { value: "./AGENTS.md、.codex/config.toml", detail: "AGENTS.md 為跨工具開放標準；config.toml 集中 hooks / mcp_servers / agents 設定。" },
    "chatgpt":      { value: "Projects 指令", detail: "GUI 填寫，每個 Project 獨立，無檔案體系。" },
    "antigravity":  { value: "./GEMINI.md、./AGENTS.md、.agents/rules/*.md", detail: "複數 rules/ 為官方預設，舊版單數相容。與 Gemini CLI 同寫 ~/.gemini/GEMINI.md 已知會衝突。" },
    "copilot-cli":  { value: ".github/copilot-instructions.md", detail: "使用者層與專案層 hooks/ 疊加載入，不是後者覆寫前者。" },
    "cursor":       { value: ".cursor/rules/*.mdc、AGENTS.md", detail: "只讀 .mdc，.md 會被忽略。原生支援 AGENTS.md。" },
  },
},
{
  id: "path-scoping",
  label: "路徑範圍規則",
  cells: {
    "claude-code":  { value: "frontmatter paths: glob", detail: "Rules 檔 frontmatter 寫 paths: [\"src/**/*.ts\"] 才在符合路徑時載入，否則不佔 context。" },
    "claude-web":   { value: "每個 Project 獨立", detail: "不同 Project 之間完全隔離，無跨 Project 路徑規則。" },
    "codex":        { value: "由近到遠，越近越後覆寫", detail: "從 git root 走到 cwd；越靠近 cwd 的規則檔覆寫越外層的。" },
    "chatgpt":      { value: "每個 Project 獨立", na: false, detail: "Project 之間互不影響。" },
    "antigravity":  { value: "全域 + 工作區 .agents/rules/", detail: "全域 ~/.gemini/config/ 與工作區 .agents/rules/ 並用；無細粒度 glob 路徑綁定。" },
    "copilot-cli":  { value: "applyTo glob（frontmatter）", detail: ".github/instructions/*.instructions.md 用 frontmatter applyTo 做路徑級 glob 控制。" },
    "cursor":       { value: ".mdc 才讀，.md 被忽略", detail: "規則檔必須是 .mdc 格式，.md 靜默略過；是常見誤設陷阱。" },
  },
},
{
  id: "privacy",
  label: "隱私退出開關",
  cells: {
    "claude-code":  { value: "帳號層 Help Improve Claude", detail: "與 Claude.ai 帳號共用；Team / Enterprise 由商業條款控管，預設不訓練。" },
    "claude-web":   { value: "Settings → Privacy → Help improve Claude", detail: "Free 方案預設開啟，需手動關。Temporary Chat 可做一次性敏感內容處理。" },
    "codex":        { value: "Data Controls 訓練開關", detail: "在 OpenAI 帳號 Settings → Data Controls 設定。" },
    "chatgpt":      { value: "Settings → Data Controls → Improve the model for everyone", detail: "Free / Plus 方案預設開啟。Temporary Chat 可做一次性隔離。" },
    "antigravity":  { value: "Enable Telemetry（Settings → Account）", detail: "Workspace 版本由管理員統一控管。" },
    "copilot-cli":  { value: "帳號 / 企業設定", detail: "企業帳號預設不訓練；個人帳號以帳號設定為準。" },
    "cursor":       { value: "帳號 Privacy 設定", detail: "Privacy Mode 依版本而異；確認以官方文件為準。" },
  },
},
]}
  notes={[
"Cursor 的兩條忽略檔：.cursorignore 全面封鎖 AI 存取，.cursorindexingignore 只排除索引、檔案仍可被讀。機密放錯檔，以為擋住了其實沒擋。",
"Google Antigravity 同時被 Gemini CLI 與 Antigravity 寫入 ~/.gemini/GEMINI.md，已知會衝突（見 02-6 第 3 節警示）。",
]}
/>

***

## 3. 記憶位置

<ToolCompare
  lang="zh"
  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: "記憶檔 / 機制",
  cells: {
    "claude-code":  { value: "~/.claude/projects/<repo>/memory/ + MEMORY.md 自動摘要", detail: "各 repo 自動累積，HMR 不重載，改後重啟 dev 才生效。", recommend: true },
    "claude-web":   { value: "Project 內 + 非 Project 對話各自維護", detail: "帳號側，Settings → Memory 管理。" },
    "chatgpt":      { value: "Saved Memories（可逐條檢視刪除）+ Reference chat history", detail: "帳號側；Projects 可隔離記憶。Settings → Personalization → Manage memories 管理。" },
    "gemini":       { value: "Personal context → Memory", detail: "帳號側。Settings → Personal context → Memory 管理。" },
    "codex":        { value: "無專屬記憶；以 AGENTS.md 替代", detail: "以常駐指令替代記憶，無跨對話的動態記憶機制。", na: false },
    "antigravity":  { value: "Memory（帳號側）", detail: "帳號設定管理。" },
    "copilot-cli":  { value: "無專屬記憶；以指令檔替代", detail: "以 ~/.copilot/ 指令檔替代，無動態記憶機制。", na: false },
    "cursor":       { value: "無專屬記憶；以 .cursor/rules/*.mdc 替代", detail: "以規則檔替代，無跨對話記憶機制。", na: false },
  },
},
{
  id: "mem-scope",
  label: "範圍",
  cells: {
    "claude-code":  { value: "各 repo 自動累積", recommend: true },
    "claude-web":   { value: "帳號側" },
    "chatgpt":      { value: "帳號側，Projects 可隔離" },
    "gemini":       { value: "帳號側" },
    "codex":        { value: "專案層" },
    "antigravity":  { value: "帳號側" },
    "copilot-cli":  { value: "專案層為主" },
    "cursor":       { value: "專案層" },
  },
},
{
  id: "mem-disable",
  label: "關閉方式",
  cells: {
    "claude-code":  { value: "Settings → Memory，或在 CLAUDE.md 明令不寫", recommend: true },
    "claude-web":   { value: "Settings → Memory" },
    "chatgpt":      { value: "Settings → Personalization → Manage memories" },
    "gemini":       { value: "Settings → Personal context → Memory" },
    "codex":        { value: "不適用", na: true },
    "antigravity":  { value: "帳號設定" },
    "copilot-cli":  { value: "不適用", na: true },
    "cursor":       { value: "不適用", na: true },
  },
},
]}
  notes={[
"Claude 的「Memory」與 ChatGPT 的「Saved Memories」觸發時機、能否逐條刪除、是否被訓練使用，三者都不同。對位概念可以，假設語意相同就會誤判隱私邊界與行為邊界。",
]}
/>

***

## 4. 自動化與整合位置

<ToolCompare
  lang="zh"
  tools={[
{ id: "claude-code",   label: "Claude Code" },
{ id: "codex",         label: "OpenAI Codex" },
{ id: "chatgpt",       label: "ChatGPT" },
{ id: "gemini-c",      label: "Gemini（消費端）" },
{ id: "antigravity",   label: "Google Antigravity" },
{ id: "copilot-cli",   label: "Copilot CLI" },
{ id: "cursor",        label: "Cursor" },
]}
  dimensions={[
{
  id: "reusable",
  label: "可重用流程",
  cells: {
    "claude-code":  { value: ".claude/skills/<n>/SKILL.md", detail: "漸進式揭露（progressive disclosure）：主檔只放必要入口，昂貴內容拆到 references/ 與 scripts/。description 寫得好壞決定模型會不會自動叫用。", recommend: true },
    "codex":        { value: "prompts/*.md（自訂命令）", detail: "AGENTS.md 的 config.toml 統一管理 hooks / agents / mcp_servers。" },
    "chatgpt":      { value: "Custom GPTs（Configure 分頁）", detail: "無檔案體系，GUI 配置。" },
    "gemini-c":     { value: "Gems", detail: "無檔案體系，GUI 配置。" },
    "antigravity":  { value: "Skills（IDE / CLI / 工作區三路徑）", detail: "IDE: ~/.gemini/config/skills/；CLI: ~/.gemini/antigravity-cli/skills/；工作區: .agents/skills/。Workflows 經 IDE 面板建立，on-disk 路徑官方未列。" },
    "copilot-cli":  { value: "~/.copilot/skills/<n>/SKILL.md、.github/skills/<n>/SKILL.md", detail: "使用者層與專案層均可放 skill；hooks/ 疊加載入。" },
    "cursor":       { value: ".cursor/rules/*.mdc", detail: "無獨立 skill 機制；以規則檔替代可重用設定。" },
  },
},
{
  id: "hooks",
  label: "事件掛鉤",
  cells: {
    "claude-code":  { value: ".claude/settings.json hooks、獨立 hooks.json", detail: "截至 2026-06 共 30 個事件（PreToolUse、PostToolUse、Stop、SessionStart 等）。exit 2 語義等同拒絕工具呼叫。", recommend: true },
    "codex":        { value: "config.toml [hooks]（stable）", detail: "stable 狀態，config.toml 統一管理。" },
    "chatgpt":      { value: "無檔案體系", na: true },
    "gemini-c":     { value: "無檔案體系", na: true },
    "antigravity":  { value: "hooks.json（.agents/ 或 ~/.gemini/config/）", detail: "兩路徑均可放，實際行為以安裝版本官方文件確認。" },
    "copilot-cli":  { value: "~/.copilot/hooks/ + .github/hooks/（疊加）", detail: "使用者層與專案層疊加載入，不是後者覆寫前者。在共用 repo 之前，先看本機會帶入哪些 hooks。" },
    "cursor":       { value: "無同等機制", na: true },
  },
},
{
  id: "subagents",
  label: "子代理",
  cells: {
    "claude-code":  { value: ".claude/agents/*.md", detail: "v2.1 起採內建（Explore、Plan、general-purpose）加自訂兩層結構。isolation: worktree 支援平行不衝突的子任務。", recommend: true },
    "codex":        { value: "config.toml [agents]（stable）", detail: "stable 狀態。" },
    "chatgpt":      { value: "無檔案體系", na: true },
    "gemini-c":     { value: "無檔案體系", na: true },
    "antigravity":  { value: "AGENTS.md + .agents/", detail: "以 AGENTS.md 與 .agents/ 為主要子代理設定。" },
    "copilot-cli":  { value: "~/.copilot/agents/<n>.agent.md、.github/agents/<n>.agent.md", detail: "使用者層與專案層均可放。" },
    "cursor":       { value: "無同等機制", na: true },
  },
},
{
  id: "mcp",
  label: "MCP 設定",
  cells: {
    "claude-code":  { value: ".mcp.json（project）、~/.claude.json（user）", detail: "scope: local（個人、不共享）、project（進版控、需 user approval）、user（個人所有專案）三層。", recommend: true },
    "codex":        { value: "config.toml [mcp_servers.<id>]", detail: "config.toml 統一管理。" },
    "chatgpt":      { value: "透過 Custom GPT Actions", detail: "無標準 MCP；以 Actions 串接外部 API。" },
    "gemini-c":     { value: "透過 Extensions", detail: "無標準 MCP；以 Extensions 整合。" },
    "antigravity":  { value: "~/.gemini/config/mcp_config.json（官方確認）", detail: "CLI 工作區：.agents/mcp_config.json。路徑以安裝版本官方文件確認。" },
    "copilot-cli":  { value: "~/.copilot/mcp-config.json、.mcp.json / .github/mcp.json / .vscode/mcp.json", detail: "多路徑支援，以你的使用場景（使用者層 vs 專案層）選對應路徑。" },
    "cursor":       { value: ".cursor/mcp.json", detail: "單一設定檔，無多層結構。" },
  },
},
]}
  notes={[
"Copilot 的 hooks 是「疊加載入」：使用者層 ~/.copilot/hooks/ 與專案層 .github/hooks/ 會一起跑（不是後者覆寫前者）。在共用 repo 之前，先看本機會帶入哪些 hooks。",
]}
/>

***

## 5. 隱私退出開關速查

<ToolCompare
  lang="zh"
  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: "開關位置（截至 2026-06）",
  cells: {
    "claude-free":       { value: "Settings → Privacy → Help improve Claude" },
    "claude-team":       { value: "由商業條款控管", detail: "Team / Enterprise 條款層級直接保障，不需手動設定。" },
    "claude-code-priv":  { value: "帳號層 Help Improve Claude", detail: "與 Claude.ai 帳號共用同一開關。" },
    "chatgpt-priv":      { value: "Settings → Data Controls → Improve the model for everyone" },
    "gemini-priv":       { value: "Settings → Keep Activity", detail: "18 歲以上帳號預設開啟。" },
    "workspace-priv":    { value: "管理員控管", detail: "由組織政策決定，個人無法單獨設定。" },
    "copilot-priv":      { value: "帳號 / 企業設定", detail: "企業帳號預設不訓練；個人帳號以帳號設定為準。" },
    "cursor-priv":       { value: "帳號 Privacy 設定", detail: "Privacy Mode 依版本，以官方文件確認。" },
  },
},
{
  id: "default-val",
  label: "預設值",
  cells: {
    "claude-free":       { value: "開（要手動關）", detail: "Free 方案預設開啟訓練資料使用，需主動退出。" },
    "claude-team":       { value: "不訓練（條款）", recommend: true },
    "claude-code-priv":  { value: "同帳號層" },
    "chatgpt-priv":      { value: "開（要手動關）", detail: "Free / Plus 方案預設開啟，Temporary Chat 可做一次性隔離。" },
    "gemini-priv":       { value: "開（18 歲以上）" },
    "workspace-priv":    { value: "由組織政策決定" },
    "copilot-priv":      { value: "企業帳號預設不訓練", recommend: true },
    "cursor-priv":       { value: "依帳號類型" },
  },
},
{
  id: "oneoff",
  label: "一次性處理",
  cells: {
    "claude-free":       { value: "Temporary Chat" },
    "claude-team":       { value: "條款層級" },
    "claude-code-priv":  { value: "帳號層" },
    "chatgpt-priv":      { value: "Temporary Chat" },
    "gemini-priv":       { value: "關閉後的對話" },
    "workspace-priv":    { value: "不適用", na: true },
    "copilot-priv":      { value: "個人帳號以帳號設定為準" },
    "cursor-priv":       { value: "Privacy Mode（依版本）" },
  },
},
]}
  notes={[
"消費端方案（ChatGPT、Gemini Free）多半預設會用於改進模型，要退出得自己關。別把企業方案的預設套到個人帳號上，反之亦然。",
]}
/>

***

## 6. 跨工具規則檔的基線：`AGENTS.md`

`AGENTS.md` 是把各家專屬規則檔收斂成一份的開放標準（Linux Foundation 旗下 Agentic AI Foundation 治理）。採用面：Codex、Cursor、Copilot、Gemini CLI、Jules、Devin、Amp、VS Code 等二十多個工具原生支援（截至 2026-06，逾六萬個開源專案採用）。

<ToolCompare
  lang="zh"
  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: "原生支援",
  cells: {
    "claude-code-ag": { value: "否（不讀 AGENTS.md）", detail: "在 CLAUDE.md 用 @AGENTS.md 語法匯入，最多 4 層遞迴。" },
    "codex-ag":       { value: "是", detail: "預設讀 root 與向上各層。", recommend: true },
    "antigravity-ag": { value: "是", detail: "與 GEMINI.md 並用。", recommend: true },
    "copilot-cli-ag": { value: "是", detail: "root 為 primary；可作為 CLAUDE.md / GEMINI.md 替代。", recommend: true },
    "cursor-ag":      { value: "是", detail: "與 .cursor/rules/*.mdc 並用。", recommend: true },
  },
},
{
  id: "share-method",
  label: "共讀作法",
  cells: {
    "claude-code-ag": { value: "在 CLAUDE.md 用 @AGENTS.md 匯入", detail: "匯入語法：在 CLAUDE.md 加入 @AGENTS.md 一行，最多 4 層遞迴展開。" },
    "codex-ag":       { value: "預設讀 root 與向上各層" },
    "antigravity-ag": { value: "與 GEMINI.md 並用" },
    "copilot-cli-ag": { value: "root 為 primary；可作為 CLAUDE.md / GEMINI.md 替代" },
    "cursor-ag":      { value: "與 .cursor/rules/*.mdc 並用" },
  },
},
]}
  notes={[
"決定哪份是基線（多半是 AGENTS.md），其餘指回它。內容重複會漂移，最後每份都半對半錯。",
]}
/>

***

## 7. 動手做：30 秒對位練習

<Note>
  **情境：把 Claude 設定搬去 Codex**

  <Steps>
    <Step title="拿目前 Claude 的六概念填表當母版">
      * 個人化：`~/.claude/CLAUDE.md`
      * 專案規則：`./CLAUDE.md`、`.claude/rules/`
      * 記憶：自動記憶 + `MEMORY.md`
      * 隱私退出：Help improve Claude 開關
      * 自動化：skills / hooks / commands
      * MCP：`.mcp.json`（project）、`~/.claude.json`（user）
    </Step>

    <Step title="逐格對位到 Codex">
      * 個人化：`~/.codex/AGENTS.md`
      * 專案規則：`./AGENTS.md`、`.codex/config.toml`
      * 隱私退出：Data Controls 訓練開關
      * 自動化：`config.toml` 的 `[hooks]`、`prompts/*.md`、`[mcp_servers.<id>]`
      * MCP：同自動化
      * 記憶：無專屬；以 `AGENTS.md` 替代
    </Step>

    <Step title="把重疊的專案規則抽成 AGENTS.md，讓兩邊共讀">
      對完你會發現只有兩件事不同：Codex 集中在 `config.toml`，而 Claude 在 `settings.json`。
    </Step>
  </Steps>
</Note>

***

## 8. 對應單元

* 層級模型與六概念框架：[02-1 設定的層級模型](/code-agent/configuration/config-layer-model)
* Claude 三產品（Chat、Cowork、Code）細節：[02-2 Anthropic Claude 設定](/code-agent/configuration/anthropic-claude-setup)
* 設定檔優先序與 `settings.local.json`：[02-3 settings.json 與 settings.local.json](/code-agent/configuration/settings-json)
* `~/.claude.json` 存了什麼：[02-4 claude.json](/code-agent/configuration/claude-json)
* Skills / Hooks / Subagents / Plugins 機制：[02-5 機制總覽](/code-agent/configuration/skills-hooks-subagents-plugins)
* 其他四套工具對位：[02-6 其他工具設定對照](/code-agent/configuration/other-tools-comparison)
* 隱私安全 checklist：[附錄 B 隱私與安全設定 checklist](/code-agent/appendix/privacy-security-checklist)
* 評估資源：[03-2 跳脫 star 數迷思](/code-agent/judgment/beyond-github-stars)、[03-3 安全、隱私與供應鏈風險](/code-agent/judgment/security-privacy-supply-chain)
* 延伸資源與社群入口：[附錄 D 延伸資源與社群清單](/code-agent/appendix/resources)
