ATO yazma ve inceleme konusunda uzmanlaşmış araçlar: dil referansı, stdlib, tasarım desenleri ve uçtan uca board tasarım iş akışı.
cd ~/.claude/skills
git clone https://github.com/atopile/atopile.git atopile mkdir -p ~/.claude/skills/ato
curl -fsSL https://raw.githubusercontent.com/atopile/atopile/HEAD/.claude/skills/ato/SKILL.md \
-o ~/.claude/skills/ato/SKILL.md Bu, atopile'de bir board tasarlamak için kanonik dizidir. Hızlı ilerleyin, yapıyı temiz tutun ve planlama durumunu birden fazla tur üzerine yaymaktan kaçının (tasarım bunu gerçekten gerektirmedikçe).
Kullanıcı niyetini hemen ato koduna dönüştürün. Temiz, yüksek seviyeli bir mimarinin başlayın ve yalnızca çözülmemiş gerçek kararlar olduğunda toplu tasarım sorularını sorun.
Odaklanın:
Araçlar: Birden çok çözülmemiş kararı bir kere toplamak için
design_questionskullanın. Tanımadığınız domains veya bileşenleri araştırmanız gerekirse mimariyi kilitlemeden önceweb_searchkullanın.
Kapı: spec .ato dosyası var, module hiyerarşisi, arayüz bağlantıları, docstrings içinde gereksinimler ve formal kısıtlamalar.
Spec, yüksek abstraksiyon seviyesinde tasarım dosyasıdır. Uygularken gerçek bileşenleri ve kablolama doldurursunuz. Dosya büyür; yapı aynı kalır.
Ana ilkeler:
ElectricPower, I2C, SPI, UART, ElectricLogic) mümkün olduğunda düşük seviyeli elektriksel bağlantılar yerine.interface tanımlamadan önce stdlib'i stdlib_list / stdlib_get_item ile kontrol edin. Var olan stdlib arayüzü veya basit stdlib arayüzleri composition/array'i çalışırsa, bunun yerine onu kullanın.Requirements: bölümü altında yakalanmalıdır.assert ile gerilim, akım, frekans sınırları için.~) birbirine bağlayın. Pin'ları henüz bağlamayın.Adım adım:
module olur — güç, MCU, sensörler, iletişim, IO, vb.Requirements: bölümü ekleyin.assert ile gerilim, akım, frekans sınırları için.~) birbirine bağlayın.Örnek spec:
import ElectricPower
import I2C
import SPI
import ElectricLogic
module SensorBoard:
"""
# Environmental Sensor Board
Pil güçlü sensör nodu, sıcaklık, nem ve
basınç ölçümü, BLE iletişim ve USB-C şarjı.
## Requirements
- R1: BLE bağlantısı — BLE 5.0 ile nRF52840
- R2: Çevresel ölçüm — sıcaklık/nem/basınç için BME280
- R3: USB-C şarjı — 5V USB-C girişi ve charge IC
- R4: Board boyutu — 25mm x 30mm max
## Anahtar Kararlar
- BLE + düşük güç için nRF52840
- sıcaklık/nem/basınç için BME280
"""
# ── Mimari ──────────────────────────────────────
power = new PowerSupply
mcu = new MCU
sensors = new EnvironmentalSensor
comms = new Radio
# Arayüz seviyesi kablolama (henüz pin değil)
power.rail_3v3 ~ mcu.power
power.rail_3v3 ~ sensors.power
mcu.i2c ~ sensors.i2c
mcu.spi ~ comms.spi
# ── Kısıtlamalar ───────────────────────────────────────
assert power.usb_in.voltage within 4.5V to 5.5V
assert power.rail_3v3.voltage within 3.3V +/- 5%
module PowerSupply:
"""
USB-C girişi, charge controller, LDO regülasyonu.
## Requirements
- R5: Pil şarjı — termal koruma ile LiPo charge IC
"""
usb_in = new ElectricPower
battery = new ElectricPower
rail_3v3 = new ElectricPower
module MCU:
"""nRF52840 kristal, decoupling ve debug header ile."""
power = new ElectricPower
i2c = new I2C
spi = new SPI
module EnvironmentalSensor:
"""BME280 çevresel sensörü."""
power = new ElectricPower
i2c = new I2C
module Radio:
"""BLE anten uyumu ve RF front end."""
spi = new SPI
Bu adım için anahtar kurallar:
PowerSupply implementasyonun tamamında PowerSupply kalır. "Spec" ile soneklemek MAY.design_questions ile açık soruları topla ve cevaplar geldikten sonra implementasyonu devam ettir.Araçlar:
stdlib_list/stdlib_get_itemözel tanımlamadan önce mevcut arayüzleri ve bileşenleri kontrol edin. Benzer sistemler için referans tasarımlar bulmak içinexamples_search/examples_read_atokullanın.
Kapı: mimari implementasyon için yeterince tutarlıdır. Birden çok açık tasarım kararı varsa, bunları design_questions ile toplayın ve cevaplar geldikten sonra devam edin.
Kullanıcıya mevcut mimayi ve çözülmemiş gerçek kararları sunun:
Birden çok tur üzerinde takip soruları akıtmak yerine, çözülmemiş kararları toplamak için design_questions kullanın. Ardından cevapları doğrudan spec'e dahil edin ve implementasyonu devam ettirin.
Kapı: anahtar açık sorular çözüldü veya makul varsayılanlar seçildi.
Şimdi spec'i gerçek bileşenler, kablolama ve kısıtlamalar ile doldurun. Bu adım paket araması, parça seçimi ve detaylı kablolama kapsar.
Sıfırdan inşa etmeden önce atopile paket registry'sinde arayın.
Araçlar:
packages_search→packages_install→package_ato_readgenel arayüzü incelemek için. Ayrıca yerleşik modules içinstdlib_listkontrol edin.
packages_search gerekli IC, konnektör veya module için eşleşme döndürmediğinde, yerel driver paketi oluşturun yerine pes edin veya kullanıcıdan bir bulmasını isteyin.
Araçlar:
parts_search→web_search(aileleri karşılaştırmak, vendor datasheet/design guide incelemek, topolojiyi doğrulamak ve referans devreleri bulmak için) →parts_install(create_package=true)→project_read_file(oluşturulan wrapper paketi incelemek için) →project_edit_file(wrapper'ı yerinde iyileştirmek için) →workspace_list_targets(iç içe paket targetleri keşfetmek için).
Adım adım tarif:
parts_search kullanın (örn. parts_search("LAN8742A")).web_search kullanın.parts_install ve create_package=true kullanın. Bu raw parçayı kurar ve packages/ altında kanonik yeniden kullanılabilir wrapper paketi oluşturur.datasheet, hardware design, application circuit, decoupling, pinout gibi terimler veya ihtiyaç duyduğunuz belirli pin'ler/özellikler ile web_search kullanın.packages/<PartName>/<PartName>.ato altındaki oluşturulan wrapper'ı ve ithal ettiği kurulu raw parçayı inceleyin, mevcut arayüzleri ve tam pin isimlerini görmek için.packages/<PartName>/<PartName>.ato'yu o parça için kanonik wrapper module olarak düşünün.ElectricPower, I2C, SPI, UART, CAN, SWD, USB2_0, USB2_0_IF, ElectricLogic, veya ElectricSignal gibi standart arayüzleri ortaya çıkarın.interface yazmadan önce, stdlib_list / stdlib_get_item ile mevcut stdlib arayüzünü kontrol edin ve proje-yerel aggregate arayüzlerden stdlib arrays/composition'ı tercih edin.sbus, phase_current, weapon_pwm, veya battlebot_interfaces gibi tasarıma özgü roller yerine uart, spi, adc_inputs, gpio, usb, swd, power gibi capability-odaklı isimler ve sınırları tercih edin._package bileşen pin'lerini bu arayüzlere eşleyin.parts_install(project_path="packages/<PartName>") ile o paket projesine kurun.workspace_list_targets çalıştırın, otomatik olarak ortaya çıkarılan paket target'lerini incelemek için.packages/<PartName>/<PartName>.ato adresinden doğrudan üst seviye tasarımda.package_agent_spawn(project_path="packages/<PartName>", goal=..., comments=...) kullanın.Örnek: oluşturulan yerel I2C mux wrapper'ı iyileştirme
packages/<PartName>/<PartName>.ato altındaki oluşturulan paket dosyası, iyileştirmeniz gereken wrapper'dır. İthal ettiği raw parça bileşeni davranışı düzenlemek için bir yer değildir.
#pragma experiment("BRIDGE_CONNECT")
import ElectricPower
import ElectricLogic
import I2C
import Capacitor
import Resistor
from "parts/Texas_Instruments_TCA9548APWR/Texas_Instruments_TCA9548APWR.ato" import Texas_Instruments_TCA9548APWR_package
module TI_TCA9548A:
# Genel arayüzler
power = new ElectricPower
assert power.voltage within 1.65V to 5.5V
i2c = new I2C
reset = new ElectricLogic
# Otomatik oluşturulan paket bileşenini örnekleştirin
package = new Texas_Instruments_TCA9548APWR_package
# Güç bağlantıları
power.hv ~ package.VCC
power.lv ~ package.GND
# I2C — .line ve .reference aracılığıyla bağlayın
i2c.sda.line ~ package.SDA
i2c.scl.line ~ package.SCL
i2c.sda.reference ~ power
i2c.scl.reference ~ power
# Decoupling — seri yol için bridge connect (~>) kullanın
decoup_100n = new Capacitor
decoup_100n.capacitance = 100nF +/- 20%
decoup_100n.package = "0402"
power.hv ~> decoup_100n ~> power.lv
decoup_2u2 = new Capacitor
decoup_2u2.capacitance = 2.2uF +/- 20%
decoup_2u2.package = "0402"
power.hv ~> decoup_2u2 ~> power.lv
# Pullup ile Reset
reset.line ~ package.nRESET
reset.reference ~ power
reset_pullup = new Resistor
reset_pullup.resistance = 10kohm +/- 1%
reset_pullup.package = "0402"
reset.line ~> reset_pullup ~> reset.reference.hv
Anahtar kurallar:
parts_install — kurulmamış bir parçaya hiçbir zaman başvurmayın.parts_install(create_package=true) tercih edin.parts_install(project_path="packages/<name>") kullanın.package_create_local kullanın..ato dosyalarını okuyun tam sinyal isimlerini görmek için (örn. package.VCC, package.SDA). Pin isimlerini ASLA tahmin etmeyin.web_search kullanın.packages/ altındaki oluşturulan paket dosyası o parça için kanonik wrapper'dır. Yerinde iyileştirin.component — asla düzenlemeyim.package_agent_spawn aracılığıyla izole wrapper inşaasını delegate etmeyi tercih edin.package = new <ComponentName> olarak örnekleştirin.main.ato extra aggregator wrapper dosyasından değil, doğrudan packages/<name>/<name>.ato adresinden wrapper paketlerini içeri aktarmalıdır..line ve .reference aracılığıyla arayüzleri bağlayın (örn. i2c.sda.line ~ package.SDA; i2c.sda.reference ~ power).~> kullanın (örn. power.hv ~> cap ~> power.lv)..capacitance, Resistor değerleri için .resistance kullanın (.value DEĞIL).~> kullanıyorsanız #pragma experiment("BRIDGE_CONNECT") ekleyin.Mümkün olduğunda generics + kısıtlamalar kullanarak bileşenleri seçin.
Araçlar: Belirli IC'ler/konektörler için
parts_search/parts_install. Vendor datasheetleri, hardware design rehberleri, uygulama notları ve alternatif parçalar içinweb_search.
Resistor, Capacitor, Inductor, Diode, LED, Fuse) değer + paket kısıtlamaları ile kullanın. Kilitli parçalar yerine generics'leri tercih edin.parts_search'ü yalnızca belirli bir parça gerektiğinde (IC, konnektör, özel bileşen) kullanın.web_search kullanın.parts_install ve wrapper paketi olması gerektiğinde create_package=true tercih edin.web_search kullanın.interface icad etmeden önce, wrapper sınırının şu şekilde temsil edilip edilemeyeceğini kontrol edin:
SPI, UART, SWD, USB2_0_IF, vb.)new ElectricLogic[3], new ElectricPower[3], new ElectricSignal[3])main.ato veya paket katmanının üzerindeki proje module'lerine aittir.Bağlantı, kısıtlamalar ve denklemler ekleyin, tasarımı tamamlayın.
~ kullanarak arayüzler aracılığıyla bağlayın (veya bridge/seri yollar için ~>).assert ... within ...) ekleyin.Kapı: tasarım tamamlandı — tüm module'ler kablolama, tüm kısıtlamalar beyan edildi, tüm arayüzler bağlı. Her bileşen kısıtlı generic veya açıkça seçilmiş parçadır.
Her şey geçene kadar iteratif olarak inşa ve sorunları düzeltin. Önce submodule'leri inşa edin (varsa) — tam inşaadan önce küçük parçaları çalıştırmak çok daha kolaydır.
Araçlar:
workspace_list_targets→build_run→build_logs_search(log_levels/stagetarafından filtre) → sessiz hatalar içindesign_diagnostics. Kısıt durumunu incelemek ve parça seçimini doğrulamak içinreport_variablesvereport_bomkullanın.
workspace_list_targets çalıştırın, böylece hangi paket target'lerinin zaten otomatik olarak var olduğunu bilirsiniz.ato.yaml girişleri eklemeyin, eğer workspace_list_targets zaten bu target'leri ortaya çıkarıyorsa.build_logs_search kontrol edin.design_diagnostics kullanın.Araçlar: Özet hazırlarken parts listesi için
report_bomve kısıt özeti içinreport_variableskullanın.
Inşa bittiğinde, kullanıcıya özet verin:
Kapı: kullanıcı net bir özet aldı ve tasarımın durumunu biliyor.
Module'leri sistem blok diyagramında labelleştireceğiniz şekilde adlandırın — sistem içindeki rolüne göre, implementasyon topolojisine göre değil. Subsystem, Unit, Block, veya Section gibi genel sonekleri kaçının.
İyi isimler:
PowerSupply — giriş koruması, regülasyon ve dağıtımPowerInput — konnektör, ters polarite koruması ve bulk decouplingBatteryCharger — charge IC, sense resistors ve durum çıkışıBMS — hücre balanslaması, koruma ve fuel gaugeGateDriver — bootstrap, dead-time ve FET köprüsü için level shiftingMotorDrive — akım sınırı ve fault çıkışı ile entegre driverCurrentSense — shunt ve sense amplifierHerhangi bir yaratıcı çalışmaya başlamadan önce bunu mutlaka kullanın - feature oluştururken, component inşa ederken, functionality eklerken veya davranış değiştirirken. Kullanıcı niyetini, gereksinimleri ve tasarımı implementation öncesinde araştırır.
Uygulama tamamlandığında, tüm testler geçtiğinde ve çalışmanızı nasıl entegre edeceğinize karar vermeniz gerektiğinde kullanın - merge, PR veya cleanup seçeneklerini sunarak geliştirme sürecinin tamamlanmasını rehberlik eder.
Kod incelemesi geri bildirimi alırken, önerileri uygulamadan önce kullanın; özellikle geri bildirim belirsiz veya teknik olarak şüpheli görünüyorsa - performatif anlaşmadan veya körü körüne uygulamadan ziyade teknik titizlik ve doğrulama gerekir.
Görevleri tamamlarken, büyük özellikleri hayata geçirirken veya merge etmeden önce çalışmanın gereksinimleri karşıladığını doğrulamak için kullanın.
Yeni bir feature üzerinde çalışmaya başlarken veya implementasyon planını yürütmeden önce kullanın - native araçlar veya git worktree fallback aracılığıyla izole edilmiş bir workspace sağlar.
Herhangi bir konuşma başlatırken kullanın - skill'lerin nasıl bulunacağını ve kullanılacağını belirler, clarification soruları da dahil olmak üzere HERHANGİ bir yanıt vermeden önce skill invocation gerektirir.