- หน้าแรก
- Documentation
- การกำหนดค่า
- การค้นพบและการแก้ไขการกำหนดค่า
การค้นพบและการแก้ไขการกำหนดค่า
เอกสารนี้อธิบายวิธีที่ coding-agent แก้ไขการกำหนดค่าในปัจจุบัน: รูทใดถูกสแกน การทำงานของลำดับความสำคัญ และการนำการกำหนดค่าที่แก้ไขแล้วไปใช้โดย settings, skills, hooks, เครื่องมือ และส่วนขยาย
การนำไปใช้หลัก:
src/config.tssrc/config/settings.tssrc/config/settings-schema.tssrc/discovery/builtin.tssrc/discovery/helpers.ts
จุดรวมสำคัญ:
src/capability/index.tssrc/discovery/index.tssrc/extensibility/skills.tssrc/extensibility/hooks/loader.tssrc/extensibility/custom-tools/loader.tssrc/extensibility/extensions/loader.ts
ขั้นตอนการแก้ไข (แผนภาพ)
หัวข้อที่มีชื่อว่า “ขั้นตอนการแก้ไข (แผนภาพ)” Config roots (ordered)┌───────────────────────────────────────┐│ 1) ~/.xcsh/agent + <cwd>/.xcsh ││ 2) ~/.claude + <cwd>/.claude ││ 3) ~/.codex + <cwd>/.codex ││ 4) ~/.gemini + <cwd>/.gemini │└───────────────────────────────────────┘ │ ▼ config.ts helper resolution (getConfigDirs/findConfigFile/findNearest...) │ ▼ capability providers enumerate items (native, claude, codex, gemini, agents, etc.) │ ▼ priority sort + per-capability dedup │ ▼ subsystem-specific consumption (settings, skills, hooks, tools, extensions)1) รูทของการกำหนดค่าและลำดับแหล่งที่มา
หัวข้อที่มีชื่อว่า “1) รูทของการกำหนดค่าและลำดับแหล่งที่มา”รูทมาตรฐาน
หัวข้อที่มีชื่อว่า “รูทมาตรฐาน”src/config.ts กำหนดรายการลำดับความสำคัญของแหล่งที่มาแบบคงที่:
.xcsh(native).claude.codex.gemini
ฐานระดับผู้ใช้:
~/.xcsh/agent~/.claude~/.codex~/.gemini
ฐานระดับโปรเจกต์:
<cwd>/.xcsh<cwd>/.claude<cwd>/.codex<cwd>/.gemini
CONFIG_DIR_NAME คือ .xcsh (packages/utils/src/dirs.ts)
ข้อจำกัดสำคัญ
หัวข้อที่มีชื่อว่า “ข้อจำกัดสำคัญ”helpers ทั่วไปใน src/config.ts ไม่รวม .pi ในลำดับการค้นพบแหล่งที่มา
2) helpers การค้นพบหลัก (src/config.ts)
หัวข้อที่มีชื่อว่า “2) helpers การค้นพบหลัก (src/config.ts)”getConfigDirs(subpath, options)
หัวข้อที่มีชื่อว่า “getConfigDirs(subpath, options)”ส่งคืนรายการที่เรียงลำดับ:
- รายการระดับผู้ใช้ก่อน (ตามลำดับความสำคัญของแหล่งที่มา)
- จากนั้นรายการระดับโปรเจกต์ (ตามลำดับความสำคัญเดียวกัน)
ตัวเลือก:
user(ค่าเริ่มต้นtrue)project(ค่าเริ่มต้นtrue)cwd(ค่าเริ่มต้นgetProjectDir())existingOnly(ค่าเริ่มต้นfalse)
API นี้ใช้สำหรับการค้นหาการกำหนดค่าแบบไดเรกทอรี (commands, hooks, tools, agents เป็นต้น)
findConfigFile(subpath, options) / findConfigFileWithMeta(...)
หัวข้อที่มีชื่อว่า “findConfigFile(subpath, options) / findConfigFileWithMeta(...)”ค้นหาไฟล์ที่มีอยู่ไฟล์แรกจากฐานที่เรียงลำดับแล้ว ส่งคืนการจับคู่แรก (เฉพาะพาธ หรือ พาธ+ข้อมูลเมตา)
findAllNearestProjectConfigDirs(subpath, cwd)
หัวข้อที่มีชื่อว่า “findAllNearestProjectConfigDirs(subpath, cwd)”เดินขึ้นไปในไดเรกทอรีแม่และส่งคืน ไดเรกทอรีที่ใกล้ที่สุดต่อฐานแหล่งที่มา (.xcsh, .claude, .codex, .gemini) จากนั้นจัดเรียงผลลัพธ์ตามลำดับความสำคัญของแหล่งที่มา
ใช้เมื่อการกำหนดค่าโปรเจกต์ควรสืบทอดจากไดเรกทอรีบรรพบุรุษ (พฤติกรรม monorepo/nested workspace)
3) wrapper ไฟล์การกำหนดค่า (ConfigFile<T> ใน src/config.ts)
หัวข้อที่มีชื่อว่า “3) wrapper ไฟล์การกำหนดค่า (ConfigFile<T> ใน src/config.ts)”ConfigFile<T> คือตัวโหลดที่ตรวจสอบ schema สำหรับไฟล์การกำหนดค่าเดียว
รูปแบบที่รองรับ:
.yml/.yaml.json/.jsonc
พฤติกรรม:
- ตรวจสอบข้อมูลที่แยกวิเคราะห์ด้วย AJV กับ TypeBox schema ที่ให้มา
- แคชผลการโหลดจนกว่าจะเรียก
invalidate() - ส่งคืนผลลัพธ์ tri-state ผ่าน
tryLoad():oknot-founderror(ConfigErrorพร้อม schema/parse context)
ยังรองรับการ migration แบบ Legacy:
- หากพาธเป้าหมายเป็น
.yml/.yamlจะมีการ migration อัตโนมัติครั้งเดียวจาก sibling.json(migrateJsonToYml)
4) โมเดลการแก้ไข Settings (src/config/settings.ts)
หัวข้อที่มีชื่อว่า “4) โมเดลการแก้ไข Settings (src/config/settings.ts)”โมเดล settings รันไทม์มีการจัดเลเยอร์:
- Global settings:
~/.xcsh/agent/config.yml - Project settings: ค้นพบผ่าน settings capability (
settings.jsonจาก providers) - Runtime overrides: อยู่ใน memory ไม่มีการบันทึกถาวร
- Schema defaults: จาก
SETTINGS_SCHEMA
เส้นทางการอ่านที่มีผล:
defaults <- global <- project <- overrides
พฤติกรรมการเขียน:
settings.set(...)เขียนไปยังเลเยอร์ global (config.yml) และจัดคิวการบันทึกในเบื้องหลัง- Project settings อ่านได้อย่างเดียวจากการค้นพบ capability
พฤติกรรม Migration ที่ยังใช้งานอยู่
หัวข้อที่มีชื่อว่า “พฤติกรรม Migration ที่ยังใช้งานอยู่”เมื่อเริ่มต้น หาก config.yml ไม่มีอยู่:
- Migration จาก
~/.xcsh/agent/settings.json(เปลี่ยนชื่อเป็น.bakเมื่อสำเร็จ) - รวมกับ legacy DB settings จาก
agent.db - เขียนผลลัพธ์ที่รวมแล้วไปยัง
config.yml
การ migration ระดับ field ใน #migrateRawSettings:
queueMode->steeringMode- มิลลิวินาที
ask.timeout-> วินาที เมื่อค่าเก่าดูเหมือนเป็น ms (> 1000) - Legacy flat
theme: "..."-> โครงสร้างtheme.dark/theme.light
5) การรวม Capability/discovery
หัวข้อที่มีชื่อว่า “5) การรวม Capability/discovery”การโหลดการกำหนดค่าที่ไม่ใช่ core ส่วนใหญ่ไหลผ่าน capability registry (src/capability/index.ts + src/discovery/index.ts)
การเรียงลำดับ Provider
หัวข้อที่มีชื่อว่า “การเรียงลำดับ Provider”Providers ถูกจัดเรียงตามลำดับความสำคัญตัวเลข (สูงกว่าก่อน) ตัวอย่างลำดับความสำคัญ:
- Native OMP (
builtin.ts):100 - Claude:
80 - Codex / agents / Claude marketplace:
70 - Gemini:
60
Provider precedence (higher wins)
native (.xcsh) priority 100claude priority 80codex / agents / ... priority 70gemini priority 60Dedup semantics
หัวข้อที่มีชื่อว่า “Dedup semantics”Capabilities กำหนด key(item):
- key เดียวกัน => รายการแรกชนะ (รายการที่มีลำดับความสำคัญสูงกว่า/โหลดก่อน)
- ไม่มี key (
undefined) => ไม่มี dedup รายการทั้งหมดถูกเก็บไว้
Keys ที่เกี่ยวข้อง:
- skills:
name - tools:
name - hooks:
${type}:${tool}:${name} - extension modules:
name - extensions:
name - settings: ไม่มี dedup (รายการทั้งหมดถูกเก็บรักษาไว้)
6) พฤติกรรม Native .xcsh provider (src/discovery/builtin.ts)
หัวข้อที่มีชื่อว่า “6) พฤติกรรม Native .xcsh provider (src/discovery/builtin.ts)”Native provider (id: native) อ่านจาก:
- project:
<cwd>/.xcsh/... - user:
~/.xcsh/agent/...
กฎการรับไดเรกทอรี
หัวข้อที่มีชื่อว่า “กฎการรับไดเรกทอรี”builtin.ts รวมรูทการกำหนดค่าเฉพาะเมื่อไดเรกทอรีมีอยู่ และไม่ว่างเปล่า (ifNonEmptyDir)
การโหลดเฉพาะ Scope
หัวข้อที่มีชื่อว่า “การโหลดเฉพาะ Scope”- Skills:
skills/*/SKILL.md - Slash commands:
commands/*.md - Rules:
rules/*.{md,mdc} - Prompts:
prompts/*.md - Instructions:
instructions/*.md - Hooks:
hooks/pre/*,hooks/post/* - Tools:
tools/*.json|*.mdและtools/<name>/index.ts - Extension modules: ค้นพบใน
extensions/(+ legacysettings.json.extensionsstring array) - Extensions:
extensions/<name>/gemini-extension.json - Settings capability:
settings.json
ความละเอียดอ่อนของการค้นหาโปรเจกต์ที่ใกล้ที่สุด
หัวข้อที่มีชื่อว่า “ความละเอียดอ่อนของการค้นหาโปรเจกต์ที่ใกล้ที่สุด”สำหรับ SYSTEM.md และ XCSH.md native provider ใช้การค้นหาไดเรกทอรี .xcsh ของโปรเจกต์ที่ใกล้ที่สุดในบรรพบุรุษ (walk-up) แต่ยังคงต้องการให้ไดเรกทอรี .xcsh ไม่ว่างเปล่า
7) วิธีที่ subsystems หลักใช้การกำหนดค่า
หัวข้อที่มีชื่อว่า “7) วิธีที่ subsystems หลักใช้การกำหนดค่า”Settings subsystem
หัวข้อที่มีชื่อว่า “Settings subsystem”Settings.init()โหลด globalconfig.yml+ รายการsettings.jsoncapability ของโปรเจกต์ที่ค้นพบ- เฉพาะรายการ capability ที่มี
level === "project"เท่านั้นที่ถูกรวมเข้าเลเยอร์โปรเจกต์
Skills subsystem
หัวข้อที่มีชื่อว่า “Skills subsystem”extensibility/skills.tsโหลดผ่านloadCapability(skillCapability.id, { cwd })- ใช้ source toggles และ filters (
ignoredSkills,includeSkills, custom dirs) - Legacy-named toggles ยังคงมีอยู่ (
skills.enablePiUser,skills.enablePiProject) แต่ใช้ควบคุม native provider (provider === "native")
Hooks subsystem
หัวข้อที่มีชื่อว่า “Hooks subsystem”discoverAndLoadHooks()แก้ไขพาธ hook จาก hook capability + พาธที่กำหนดค่าอย่างชัดเจน- จากนั้นโหลด modules ผ่าน Bun import
Tools subsystem
หัวข้อที่มีชื่อว่า “Tools subsystem”discoverAndLoadCustomTools()แก้ไขพาธ tool จาก tool capability + plugin tool paths + พาธที่กำหนดค่าอย่างชัดเจน- ไฟล์ tool แบบ declarative
.md/.jsonเป็นเพียง metadata เท่านั้น การโหลด executable คาดหวัง code modules
Extensions subsystem
หัวข้อที่มีชื่อว่า “Extensions subsystem”discoverAndLoadExtensions()แก้ไข extension modules จาก extension-module capability บวกกับพาธที่ชัดเจน- การนำไปใช้ปัจจุบันจงใจเก็บเฉพาะรายการ capability ที่มี
_source.provider === "native"ก่อนโหลด
8) กฎลำดับความสำคัญที่ควรพึ่งพา
หัวข้อที่มีชื่อว่า “8) กฎลำดับความสำคัญที่ควรพึ่งพา”ใช้โมเดลความคิดนี้:
- ลำดับไดเรกทอรีแหล่งที่มาจาก
config.tsกำหนดลำดับพาธผู้สมัคร - ลำดับความสำคัญของ capability provider กำหนดลำดับความสำคัญข้าม provider
- Capability key dedup กำหนดพฤติกรรมการชนกัน (first wins สำหรับ keyed capabilities)
- Logic การรวม subsystem เฉพาะสามารถเปลี่ยนลำดับความสำคัญที่มีผลเพิ่มเติม (โดยเฉพาะ settings)
ข้อแม้เฉพาะ Settings
หัวข้อที่มีชื่อว่า “ข้อแม้เฉพาะ Settings”รายการ settings capability ไม่ถูก deduplicate; Settings.#loadProjectSettings() deep-merges รายการโปรเจกต์ตามลำดับที่ส่งคืน เนื่องจากการ merge ใช้ค่าของรายการที่อยู่หลังทับค่าก่อนหน้า พฤติกรรม override ที่มีผลขึ้นอยู่กับลำดับการ emit ของ provider ไม่ใช่แค่ semantics ของ capability key เท่านั้น
9) พฤติกรรม Legacy/compatibility ที่ยังคงมีอยู่
หัวข้อที่มีชื่อว่า “9) พฤติกรรม Legacy/compatibility ที่ยังคงมีอยู่”- การ migration JSON -> YAML ของ
ConfigFileสำหรับไฟล์ที่กำหนดเป้าหมายเป็น YAML - การ migration Settings จาก
settings.jsonและagent.dbไปยังconfig.yml - การ migration key ของ Settings (
queueMode,ask.timeout, flattheme) - ความเข้ากันได้ของ extension manifest: loader รับทั้งส่วน manifest
package.json.xcshและpackage.json.pi - Legacy setting names
skills.enablePiUser/skills.enablePiProjectยังคงเป็น active gates สำหรับ native skill source
หากพาธ compatibility เหล่านี้ถูกลบออกจากโค้ด ให้อัปเดตเอกสารนี้ทันที เนื่องจากพฤติกรรมรันไทม์หลายอย่างยังคงพึ่งพาพวกมันในปัจจุบัน