Skip to content

Latest commit

ย 

History

History
108 lines (81 loc) ยท 5.8 KB

File metadata and controls

108 lines (81 loc) ยท 5.8 KB

barshelf CLI ๋ ˆํผ๋Ÿฐ์Šค

barshelf๋Š” BarShelf ์œ„์ ฏ์„ ๋งŒ๋“ค๊ณ , ๊ฒ€์ฆํ•˜๊ณ , ํŒจํ‚ค์ง•ํ•˜๊ณ , ์„ค์น˜ํ•˜๋Š” ๋…๋ฆฝ CLI๋‹ค. GUI ์•ฑ ์—†์ด ๋™์ž‘ํ•˜๋ฉฐ(์ˆœ์ˆ˜ CLI), ์•ฑ๊ณผ ๊ฐ™์€ Core ๋””์ฝ”๋”ยท์„ค์น˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ด€๋ จ ๋ฌธ์„œ:

์„œ๋ธŒ์ปค๋งจ๋“œ ์š”์•ฝ

barshelf install <src>                  # GitHub URL / ๋กœ์ปฌ ์œ„์ ฏ ๋””๋ ‰ํ† ๋ฆฌ / .zipยท.mbw(๊ฒฝ๋กœยทURL) / ๋”ฅ๋งํฌ
barshelf new <name> [--kind exec|workflow|script] [--dir <path>]   # ๊ธฐ๋ณธ kind=exec, ๊ธฐ๋ณธ dir=./<name>
barshelf validate <path>                # widget.json(+workflow.json ์žˆ์œผ๋ฉด) Core ๋””์ฝ”๋”๋กœ ๊ฒ€์ฆ, ์˜ค๋ฅ˜๋ฅผ ํŒŒ์ผ:ํ•„๋“œ ๋‹จ์œ„๋กœ ์ถœ๋ ฅ
barshelf pack <dir> [-o <name>.mbw]     # zip(.mbw) ์ƒ์„ฑ + ์•„์นด์ด๋ธŒ์— manifest.sha256 ํฌํ•จ(widget.json์˜ sha256)
barshelf list                           # ์„ค์น˜๋œ ์œ„์ ฏ ๋‚˜์—ด (id, name, version, kind)
barshelf agent-spec                     # ์œ„์ ฏ ์ž‘์„ฑ ์ŠคํŽ™(docs/AGENTS.md)์„ stdout์œผ๋กœ ์ถœ๋ ฅ (LLM ์—์ด์ „ํŠธ์šฉ)
barshelf --version / --help

bsf๋Š” ๊ฐ™์€ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ์งง์€ alias๋‹ค. ๋ฌธ์„œ์™€ ์—์ด์ „ํŠธ ์ŠคํŽ™์€ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด canonical ๋ช…๋ น์ธ barshelf๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ปค๋งจ๋“œ ์ธ์ž/์˜ต์…˜ ๋™์ž‘
barshelf install <src> GitHub ์ €์žฅ์†Œ URL, ๋กœ์ปฌ ์œ„์ ฏ ๋””๋ ‰ํ† ๋ฆฌ, .zip/.mbw(๋กœ์ปฌ ๊ฒฝ๋กœ ๋˜๋Š” URL), barshelf://install?... ๋”ฅ๋งํฌ R05 URL ์„ค์น˜ ๊ณ„์•ฝ ๊ทธ๋Œ€๋กœ ๋‹ค์šด๋กœ๋“œโ†’์ถ”์ถœโ†’ํƒ์ƒ‰โ†’์„ค์น˜. ๋‹ค์ด์–ผ๋กœ๊ทธ ์—†์ด ๊ถŒํ•œ ์š”์•ฝ์„ stdout์— ์ถœ๋ ฅํ•˜๊ณ , --yes๊ฐ€ ์—†์œผ๋ฉด stdin ํ™•์ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋„์šด๋‹ค. ํŒŒ์ดํ”„ ๋“ฑ ๋น„์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์ด๋ฉด ์ž๋™ ์ง„ํ–‰ํ•˜๊ณ  ์š”์•ฝ์„ ์ถœ๋ ฅํ•œ๋‹ค.
barshelf new <name> --kind exec|workflow|script (๊ธฐ๋ณธ exec), --dir <path> (๊ธฐ๋ณธ ./<name>) ํ…œํ”Œ๋ฆฟ์—์„œ ์ƒˆ ์œ„์ ฏ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑ ์งํ›„ barshelf validate๋ฅผ ์ž๋™ ์‹คํ–‰ํ•ด green ํ™•์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
barshelf validate <path> ์œ„์ ฏ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” pack๋œ .mbw ํŒŒ์ผ widget.json(๊ทธ๋ฆฌ๊ณ  workflow.json์ด ์žˆ์œผ๋ฉด ํ•จ๊ป˜)์„ Core ๋””์ฝ”๋”๋กœ ๊ฒ€์ฆํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ํŒŒ์ผ:ํ•„๋“œ ๋‹จ์œ„๋กœ ์ถœ๋ ฅํ•œ๋‹ค. .mbw๋ฅผ ๋ฐ›์œผ๋ฉด ์•ˆ์ „ ์ถ”์ถœ ํ›„ ๊ฒ€์ฆํ•œ๋‹ค.
barshelf pack <dir> -o <name>.mbw (์ถœ๋ ฅ ํŒŒ์ผ๋ช…) ์œ„์ ฏ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ zip(.mbw)์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ , ์•„์นด์ด๋ธŒ์— manifest.sha256(widget.json์˜ sha256)์„ ํฌํ•จํ•œ๋‹ค.
barshelf list โ€” ์„ค์น˜๋œ ์œ„์ ฏ์„ id, name, version, kind๋กœ ๋‚˜์—ดํ•œ๋‹ค.
barshelf agent-spec โ€” ์œ„์ ฏ ์ž‘์„ฑ ์ŠคํŽ™(docs/AGENTS.md)์„ stdout์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. LLM ์—์ด์ „ํŠธ์—๊ฒŒ ์œ„์ ฏ ์ œ์ž‘ ๊ณ„์•ฝ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋„˜๊ธธ ๋•Œ ์“ด๋‹ค. ๊ฐœ๋ฐœ ์ฒดํฌ์•„์›ƒ์—์„œ๋Š” ๋””์Šคํฌ์˜ docs/AGENTS.md๋ฅผ, ๋‹จ๋… ๋ฐฐํฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ๋Š” ๋นŒ๋“œ์‹œ ๋‚ด์žฅ๋œ ์‚ฌ๋ณธ์„ ์ถœ๋ ฅํ•œ๋‹ค(๋‚ด์šฉ ๋™์ผ).
barshelf --version / barshelf --help โ€” ๋ฒ„์ „/๋„์›€๋ง ์ถœ๋ ฅ.

new ํ…œํ”Œ๋ฆฟ 3์ข…

kind ํ…œํ”Œ๋ฆฟ ๋‚ด์šฉ
exec hello์‹ ์…ธ ์Šคํฌ๋ฆฝํŠธ + manifest
workflow recent-files ์ถ•์†ŒํŒ (workflow.json ํฌํ•จ)
script clock-script ์ถ•์†ŒํŒ (import { barshelf, ui } from "barshelf")

์ถœ๋ ฅ๊ณผ exit ์ฝ”๋“œ

  • exit 0 ์„ฑ๊ณต / exit 1 ์‹คํŒจ.
  • ์ถœ๋ ฅ์€ ์‚ฌ๋žŒ์ด ์ฝ๋Š” ํ‰๋ฌธ์ด๋‹ค(์ปฌ๋Ÿฌ ๋ถˆํ•„์š”).
  • ์˜ค๋ฅ˜๋Š” stderr๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

์˜ˆ์ œ ์„ธ์…˜

์ƒˆ ์œ„์ ฏ์„ ๋งŒ๋“ค๊ณ  ๊ฒ€์ฆยทํŒจํ‚ค์ง•ํ•ด ์„ค์น˜๊นŒ์ง€ ํ™•์ธํ•˜๋Š” ํ๋ฆ„:

# 1. ์ƒˆ exec ์œ„์ ฏ ์ƒ์„ฑ (์ƒ์„ฑ ์งํ›„ validate๊ฐ€ ์ž๋™ ์‹คํ–‰๋œ๋‹ค)
$ barshelf new my-clock
Created widget at ./my-clock (kind: exec)
Validating ./my-clock ... OK

# 2. ์ˆ˜์ • ํ›„ ์žฌ๊ฒ€์ฆ โ€” ์˜ค๋ฅ˜๋Š” ํŒŒ์ผ:ํ•„๋“œ ๋‹จ์œ„๋กœ ์ถœ๋ ฅ๋œ๋‹ค
$ barshelf validate ./my-clock
my-clock/widget.json: refresh.interval: expected number, found string
$ echo $?
1

# 3. ๊ณ ์น˜๊ณ  ๋‹ค์‹œ ๊ฒ€์ฆ
$ barshelf validate ./my-clock
OK

# 4. .mbw ์•„์นด์ด๋ธŒ๋กœ ํŒจํ‚ค์ง•
$ barshelf pack ./my-clock -o my-clock.mbw
Packed my-clock.mbw (manifest.sha256 included)

# 5. pack๋œ .mbw๋„ validate๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค
$ barshelf validate my-clock.mbw
OK

# 6. URL ๋˜๋Š” ๋กœ์ปฌ ์•„์นด์ด๋ธŒ๋กœ ์„ค์น˜ โ€” ๊ถŒํ•œ ์š”์•ฝ์„ ๋ณด์—ฌ์ฃผ๊ณ  ํ™•์ธ์„ ๋ฐ›๋Š”๋‹ค
$ barshelf install https://github.com/example/barshelf-widgets/tree/main/widgets/clock
Widget: Clock (dev.example.clock) 0.1.0
Permissions: exec ./clock.sh
Install? [y/N] y
Installed to ~/Library/Application Support/barshelf/widgets/dev.example.clock

# ๋น„์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ(ํŒŒ์ดํ”„/CI)์—์„œ๋Š” ์ž๋™ ์ง„ํ–‰ + ์š”์•ฝ ์ถœ๋ ฅ, ๋˜๋Š” --yes๋กœ ํ™•์ธ ์ƒ๋žต
$ barshelf install --yes https://github.com/example/barshelf-widgets

# 7. ์„ค์น˜๋œ ์œ„์ ฏ ํ™•์ธ
$ barshelf list
dev.example.clock  Clock  0.1.0  exec

๋ฉ”์‹œ์ง€ ๋ฌธ๊ตฌ๋Š” ์˜ˆ์‹œ์ด๋ฉฐ ๋ฆด๋ฆฌ์Šค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ณ„์•ฝ์œผ๋กœ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์„œ๋ธŒ์ปค๋งจ๋“œยท์˜ต์…˜ยทexit ์ฝ”๋“œยทstderr ์˜ค๋ฅ˜ ์ถœ๋ ฅ์ด๋‹ค.

์•ฑ๊ณผ์˜ ๊ด€๊ณ„

barshelf install์€ ์•ฑ์˜ ์„ค์น˜ ํŒŒ์ดํ”„๋ผ์ธ์„ GUI ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ๋…๋ฆฝ ์‹คํ–‰ ํŒŒ์ผ์ด๋‹ค. ์•ฑ ๋ฒˆ๋“ค ๋‚ด๋ถ€ ์‹คํ–‰ ํŒŒ์ผ(BarShelf.app/Contents/MacOS/barshelf-app)์—๋„ headless install ๋ชจ๋“œ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€๋งŒ, ์™ธ๋ถ€ ๋ฌธ์„œ์™€ ์ž๋™ํ™”์—์„œ๋Š” CLI์ธ barshelf ๋˜๋Š” alias bsf๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋นŒ๋“œ

DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer swift build --product barshelf
swift run barshelf --help
swift run bsf --help

์•ฑ ๋ฒˆ๋“ค ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ(scripts/build_app.sh)๋Š” dist/์— barshelf์™€ bsf ๋ฐ”์ด๋„ˆ๋ฆฌ๋„ ํ•จ๊ป˜ ๋ณต์‚ฌํ•œ๋‹ค.