การสร้างแอป สำหรับเอเจนต์
วิธีที่เอเจนต์สร้างแอป Laze ที่ผู้คนอยากใช้: กฎการออกแบบ ชุดเครื่องมือ การปักหมุดและการแชร์ การ push ไปยัง trunk และการตรวจงานของตัวเอง
หน้านี้เขียนไว้สำหรับเอเจนต์ AI ที่ได้รับคำขอให้สร้างหรือแก้ไขแอป Laze อ่านก่อนทำ laze app create ครั้งแรกของคุณ ผู้คนตัดสินแอปใน 5 วินาทีแรก ทำให้แอปดูเสร็จสมบูรณ์ วางไว้ในที่ที่เขาขอ และตรวจสอบด้วยตัวเองก่อนบอกว่าพร้อมแล้ว
เวิร์กโฟลว์
-
สร้างในบทสนทนาที่ขอมา:
laze app create "Insights" --channel <channel>แอปจะเริ่มแบบว่างเปล่า พร้อมโฟลเดอร์ที่เป็นของคุณ สร้างตั้งแต่ต้นโดยเริ่มที่
index.htmlแล้วตามด้วยlaze app push--channelจะปักหมุดแอปเป็นแท็บของการสนทนานั้น ทุกคนในนั้น รวมถึงเอเจนต์ของพวกเขา สามารถเปิดและต่อยอดได้ (ผู้สร้าง) ตั้งชื่อแอปเป็นคำที่คนอ่านเข้าใจ ไม่ใช่ slugลิงก์ platform kit และ client จากหน้าของคุณ:
<link rel="stylesheet" href="/_laze/theme.css" /> <link rel="stylesheet" href="/_laze/kit.css" /> <script src="/_laze/laze.js"></script>สไลด์ เด็ก หรือทอล์กเป็นข้อยกเว้นเดียว โดยเริ่มจาก
--template slidesซึ่งเป็นเทมเพลตเดียว ไฟล์ของเทมเพลตนี้คือเวอร์ชันจริงแรกของแอป และคุณแก้ไขได้ แต่ละสไลด์เป็นไฟล์หนึ่งไฟล์ในslides/และเรียงลำดับในslides/deck.jsonREADME.mdของเทมเพลตบอกวิธีเพิ่ม เรียงลำดับใหม่ และกำหนดสไตล์สไลด์ เด็กมีรางสไลด์ การนำทางด้วยแป้นพิมพ์ Present แบบเต็มหน้าจอ และปุ่ม Export PDF กับ Export HTML อยู่แล้ว จึงไม่ต้องสร้างสิ่งเหล่านี้ซ้ำ ผ่าน MCPcreate_appพร้อมtemplate: "slides"ทำแบบเดียวกัน และwrite_app_filesเปลี่ยนสไลด์ทีละหน้าเทมเพลตสไลด์ใช้สำหรับเด็กใหม่เท่านั้น เมื่อบุคคลส่งไฟล์ที่เป็นเพจหรือเด็กอยู่แล้ว เช่น HTML export, zip ที่มี
index.htmlหรือ static site ให้นำขึ้นตามเดิม สร้างแอปโดยไม่มี--templateแตกไฟล์ลงในโฟลเดอร์ของแอปโดยมีindex.htmlอยู่ด้านบน คัดลอกสคริปต์ใด ๆ ที่โหลดจาก CDN เข้ามาด้วย แล้วพุช ถ้ามีไฟล์แนบพร้อมคำว่า “ย้ายมาที่นี่” หรือ “วางอันนี้ไว้ที่นี่” ความหมายก็คือตามนั้น ทำเลย ไม่ต้องถามว่าหมายถึงอะไร -
แอปที่มีอยู่แล้ว ต้องเข้าไปในบทสนทนาด้วยการปักหมุด ไม่ใช่ข้อความที่มีลิงก์:
laze app pin <app> --channel <channel>--role editorทำให้สมาชิกเปลี่ยนข้อมูลได้แต่แก้โค้ดไม่ได้ ส่วน--view-onlyทำให้ดูได้เท่านั้นlaze app pins <channel>แสดงรายการแท็บ อย่าปักหมุดแอปที่บุคคลเลิกปักหมุดแล้วซ้ำอีก -
กำหนดรูปข้อมูล ใน
laze.app.json: หนึ่งคอลเลกชันต่อชนิดของสิ่งของ พร้อมฟิลด์ที่มีชนิดข้อมูลและ seed record บางรายการ ข้อมูลอยู่ในเรคคอร์ด ไม่อยู่ในโค้ดของหน้า หน้าที่ฮาร์ดโค้ดตัวเลข แถว หรือข้อความถือว่าผิด เมื่อข้อมูลเปลี่ยน แอปต้องเปลี่ยนโดยไม่ต้องพุช -
แก้ไขหน้า แล้วดูในเครื่องก่อนปล่อยจริง (ดู ตรวจงานของคุณเอง)
-
พุช:
laze app push -m "Added the pipeline board" --seedทุกการพุชจะเป็นแอปจริงทันที ไม่มีฉบับร่าง branch หรือ pull request แอปใช้ trunk based เขียนข้อความเป็นประโยคธรรมดาที่บอกว่าสิ่งใดเปลี่ยนไปสำหรับผู้คน
--seedเติมเฉพาะคอลเลกชันที่ยังไม่มีเรคคอร์ด -
ย้อนกลับ เมื่อพุชผิด:
laze app versionsแล้วตามด้วยlaze app revert <version> -m "<why>"นี่คือเวอร์ชันจริงใหม่ ไม่มีเรคคอร์ดใดหาย ประวัติ git ภายในแอปมีไว้เพื่อสิ่งนี้เท่านั้น
ใครเปิดได้บ้าง
| การมองเห็น | ใครเปิดได้ |
|---|---|
| จำกัด | บุคคล เอเจนต์ และการสนทนาที่แชร์หรือปักหมุดไว้ รวมถึงเจ้าของและแอดมินของพื้นที่ทำงาน |
| ช่อง | สมาชิกของช่องของแอป |
| ภายใน | ทุกคนในพื้นที่ทำงาน |
| สาธารณะ | ทุกคนที่มีที่อยู่ |
แอปใหม่เป็นแบบจำกัด แอปที่ปักหมุดในบทสนทนาจะเปิดให้ทุกคนในนั้น ดังนั้นการปักหมุดมักเพียงพอสำหรับการแชร์แอปของทีม อย่าแชร์แอปเฉพาะกับคนที่ขอเมื่อเขาขอในช่อง ให้ปักหมุดไว้ที่นั่น ขยายการเข้าถึงด้วย laze app access visibility internal|public เฉพาะเมื่อถูกขอเท่านั้น คำสั่งจะบอกเมื่อผู้ดูแลระบบต้องอนุมัติ laze app members แสดงว่าใครเปิดได้ตอนนี้ ตรวจสอบก่อนบอกผู้คนว่าแอปพร้อมแล้ว
กฎการออกแบบ
เริ่มจากเรื่องของแอป ไม่ใช่จากเลย์เอาต์ ถามว่าคนที่ใส่ใจเรื่องนั้นจะวาดมันบนไวต์บอร์ดอย่างไร แล้วสร้างสิ่งนั้น โมเดลภัยคุกคามคือแผนที่การโจมตี โรดแมปคือไทม์ไลน์ งบประมาณคือการไหลของเงิน กระบวนการคือไดอะแกรม หน้าที่มีการ์ดสถิติและรายการหัวข้อย่อยจะอ่านเหมือนรายงาน และนั่นคือแอปที่ควรหลีกเลี่ยง
เน้นภาพให้มาก: ใช้ภาพเคลื่อนไหวและผังขั้นตอนเมื่อทำได้ และพาผู้คนไปทีละขั้นจนเข้าใจครบถ้วน อย่าเขียนข้อความยาวเป็นพืด ตรงไหนต้องใช้คำ ให้ใช้ประโยคที่ง่ายและสั้น แอปมีไว้ให้คนเข้าใจ ไม่ใช่ที่ระบายทุกอย่างในหัวของคุณ
Laze kit มาจากแพลตฟอร์ม (/_laze/theme.css, /_laze/kit.css, /_laze/laze.js) มันเป็นกล่องเครื่องมือ ไม่ใช่เลย์เอาต์ให้เติม เลือกใช้โทเค็นและตัวควบคุมที่ต้องการ แล้วใส่ CSS ของคุณเองไว้ในไฟล์ของคุณเองทับด้านบน อย่าคัดลอก kit เข้าไปในแอป
- ภาพมาก่อน ทำให้ภาพของเรื่องนั้นเป็นตัวแอปเอง เช่น inline SVG, canvas, แผนที่, ไทม์ไลน์, ไดอะแกรม หรือสิ่งที่ผู้คนคลิกและสำรวจได้ ทำให้มีหน้าตาเป็นของตัวเอง ด้วยเลย์เอาต์และการเคลื่อนไหวของคุณบนโทเค็นของ kit
- หนึ่งงานต่อหนึ่งหน้าจอ หน้าจอแรกตอบคำถามที่แอปถูกสร้างมาเพื่อตอบ วางงานที่สองไว้ในแท็บ (
lz-tabs) ไม่ใช่ใต้หน้าจอแรก - รูปทรงที่ถูกต้อง ใช้ตาราง (
lz-table) หรือบอร์ด (lz-board) เมื่อผู้คนต้องสแกนหรือย้ายแถว ใช้การ์ดสถิติ (lz-stats,lz-stat-value) เมื่อประเด็นคือเลขหนึ่งค่า ใช้แผนภูมิ (lz-chart) สำหรับตัวเลขตามเวลา และใช้ขั้นตอนแบบมีหมายเลข (lz-steps) สำหรับลำดับสั้น ๆ ข้อความที่ยาวเกินสามบรรทัดควรอยู่ในเอกสาร ไม่ใช่ในแอป - ข้อมูลจริง แสดงเรคคอร์ดที่ผู้คนสนใจ พร้อมชื่อและวันที่จริง ไม่มี “Lorem”, “Item 1” หรือแผนภูมิ placeholder ทุกข้อกล่าวอ้างบนหน้าต้องมาจากเรคคอร์ดหรือลิงก์
- สเกลตัวอักษร ชื่อหน้าหนึ่งรายการ (
lz-title), บรรทัดใต้ชื่อหน้าหนึ่งบรรทัด (lz-lede), ชื่อส่วน (lz-h2หรือlz-card-title), และข้อความเนื้อหา อย่าเพิ่มขนาดอื่น - ระยะห่าง ใช้คลาสหน้า (
lz-page), การ์ด (lz-card lz-card-body) และกริด (lz-grid,lz-row) คลาสเหล่านี้รักษาจังหวะ 12 ถึง 20 px อย่าซ้อนการ์ดไว้ในการ์ด - ทั้งสองธีม สีต้องมาจากโทเค็นเท่านั้น (
var(--color-fg),var(--color-bg-surface),var(--color-primary),var(--color-border)และโทนlz-badge-*) สี hex จะทำให้โหมดมืดเสีย - ความกว้างแคบ แอปเปิดในแผงด้านข้างกว้างประมาณ 380 px ใส่
data-labelให้เซลล์ตารางเพื่อให้แถวซ้อนกัน และให้ส่วนหัวอยู่บรรทัดเดียว - สถานะว่างและข้อผิดพลาด รายการว่างบอกว่าจะมีอะไรปรากฏและจะเพิ่มรายการแรกอย่างไร การเรียกที่ล้มเหลวแสดง
Laze.fail(error)ห้ามเป็นหน้าว่าง - สถานะเป็นแบดจ์ แสดงสถานะด้วย
lz-badgeและโทน (-success,-warning,-danger,-info,-primary) ไม่ใช่ข้อความสี - ฟอร์มไม่ขวางทาง วาง “รายการใหม่” ไว้หลังปุ่ม รายการคือเนื้อหาหลัก
อ้างอิง kit
| ความต้องการ | คลาส |
|---|---|
| หน้าและส่วนหัว | lz-page, lz-header, lz-title, lz-lede |
| เลย์เอาต์ | lz-row, lz-grow, lz-grid, lz-stats |
| การ์ด | lz-card, lz-card-body, lz-card-title, lz-h2 |
| ตาราง | lz-table-wrap, lz-table, lz-num (ตัวเลขจัดชิดขวา) |
| บอร์ด | lz-board, lz-column, lz-column-head, lz-tile |
| ตัวเลข | lz-stat-value, lz-chart, lz-chart-col, lz-chart-track, lz-chart-bar, lz-chart-value, lz-chart-label |
| ขั้นตอน | ol.lz-steps พร้อม li หนึ่งรายการต่อขั้นตอน |
| ตัวควบคุม | lz-btn, lz-btn-primary, lz-btn-ghost, lz-input, lz-select, lz-textarea, lz-field, lz-form, lz-tabs, lz-tab |
| สถานะ | lz-badge (+ โทน), lz-callout, lz-empty, lz-muted |
สคริปต์โหลดได้จาก origin ของแอปเองเท่านั้น CDN <script> จะถูกปฏิเสธ ดังนั้นให้คัดลอกไลบรารีที่ต้องใช้เข้าไปในโฟลเดอร์ของแอป เมื่อต้องพอร์ต claude.ai artifact หรือหน้า React อื่น ให้คอมไพล์ JSX ก่อนพุช เช่น npx esbuild app.jsx --bundle --minify --outfile=app.js แล้วลิงก์ไฟล์ที่ build แล้ว Babel ในเบราว์เซอร์ก็ใช้ได้ แต่จะโหลดหลายเมกะไบต์ทุกครั้งที่เปิด
ในสคริปต์ของหน้า Laze.records("<collection>") ใช้แสดงรายการ สร้าง อัปเดต และลบเรคคอร์ด Laze.subscribe โหลดใหม่เมื่อมีการเปลี่ยนแปลง Laze.h สร้างองค์ประกอบ และ Laze.mount วาดองค์ประกอบเหล่านั้น
แป้นพิมพ์ลัด
Laze ส่งแป้นพิมพ์ลัดของตัวเองจากแอปของคุณไปยัง Laze เว้นแต่แอปของคุณจะจัดการเอง เพื่อให้ผู้คนกด Cmd+K (Ctrl+K บน Windows และ Linux) เพื่อออกจากแอปได้โดยไม่ต้องคลิกออกจากแอปก่อน แป้นพิมพ์ลัดที่ส่งต่อคือ Cmd+K, Cmd+[ และ Cmd+], Cmd+1 ถึง Cmd+9, Cmd+Shift+A, Cmd+Shift+T, Cmd+Shift+M, Cmd+Shift+D, Cmd+. และ Cmd+/ รวมถึง Alt+Up และ Alt+Down เมื่ออยู่นอกช่องข้อความ ปุ่มอื่นทั้งหมดจะอยู่ในแอปของคุณ
หากต้องการเก็บแป้นพิมพ์ลัดเหล่านี้ไว้ให้แอปของคุณ ให้จัดการปุ่มนั้นและเรียก event.preventDefault() จากนั้น Laze จะปล่อยไว้:
document.addEventListener("keydown", (event) => {
if ((event.metaKey || event.ctrlKey) && event.key === "k") {
event.preventDefault();
openSearch();
}
});ตรวจงานของคุณเอง
ดูทุกการเปลี่ยนแปลงก่อนพุช:
laze app serve --port 4173คำสั่งนี้เสิร์ฟโฟลเดอร์ของคุณที่ http://127.0.0.1:4173/ พร้อม platform kit และเรคคอร์ดของแอปจริงแบบอ่านอย่างเดียว ต้องมีเวอร์ชันจริงก่อน ดังนั้นให้รัน laze app push หนึ่งครั้งก่อน เปิดด้วยเครื่องมือเบราว์เซอร์ของคุณ แล้วถ่ายภาพหน้าจอทั้งสองธีมและที่ความกว้างแผง ตัวอย่างเช่น:
npx -y playwright install chromium # once
npx -y playwright screenshot --viewport-size=1100,800 http://127.0.0.1:4173/ light.png
npx -y playwright screenshot --viewport-size=1100,800 "http://127.0.0.1:4173/?theme=dark" dark.png
npx -y playwright screenshot --viewport-size=390,800 http://127.0.0.1:4173/ narrow.pngดูแต่ละภาพ แก้ข้อความที่ล้น คอลัมน์ที่ใส่ไม่พอ สีที่หายไปในโหมดมืด และสิ่งที่ยังเขียนว่า “demo”
ก่อนโพสต์แอป:
- แอปถูกปักหมุดในที่ที่ขอไว้ และ
laze app membersแสดงรายการผู้คนที่ควรเปิดได้ - หน้าจอแรกตอบคำขอได้โดยไม่ต้องเลื่อน
- ภาพหน้าจอโหมดสว่าง โหมดมืด และ 390 px ดูเสร็จสมบูรณ์
- ข้อความของคุณบอกชื่อแอปและหนึ่งบรรทัดว่าแอปทำอะไร แท็บในบทสนทนาคือลิงก์
ถามเมื่อไม่แน่ใจ
ถามบุคคลนั้นด้วยคำถามสั้น ๆ หนึ่งข้อ แทนที่จะสร้างสิ่งที่ผิด อย่ารอคำว่า “go” สำหรับขั้นตอนที่เขาขอไว้แล้ว ถ้าเขาขอแอปในช่องนี้ ให้สร้างที่นั่น ปักหมุด และบอกเขา