CLOVER๐Ÿ€

That was when it all began.

MicrosoftใฎAIใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ็”จใฎใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใƒžใƒใƒผใ‚ธใƒฃใƒผใ€APM๏ผˆAgent Package Manager๏ผ‰ใ‚’่ฉฆใ™

ใ“ใ‚Œใฏใ€ใชใซใ‚’ใ—ใŸใใฆๆ›ธใ„ใŸใ‚‚ใฎ๏ผŸ

MicrosoftใŒๅ…ฌ้–‹ใ—ใฆใ„ใ‚‹APM๏ผˆAgent Package Manager๏ผ‰ใŒใกใ‚‡ใฃใจๆฐ—ใซใชใฃใŸใฎใงใ€่ฉฆใ—ใฆใฟใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚

APM๏ผˆAgent Package Manager๏ผ‰

APM๏ผˆAgent Package Manager๏ผ‰ใฎWebใ‚ตใ‚คใƒˆใฏใ“ใกใ‚‰ใ€‚

APM - Agent Package Manager | Agent Package Manager

GitHubใƒชใƒใ‚ธใƒˆใƒชใƒผใฏใ“ใกใ‚‰ใ€‚

GitHub - microsoft/apm: Agent Package Manager · GitHub

APMใฏAgent Package Managerใฎ็•ฅใง๏ผˆไปฅ้™ใฏๅ˜ใซAPMใจๆ›ธใใพใ™๏ผ‰ใ€AIใ‚จใƒผใ‚ธใ‚งใƒณใƒˆๅ‘ใ‘ใฎไพๅญ˜้–ขไฟ‚ใƒžใƒใƒผใ‚ธใƒฃใƒผใงใ™ใ€‚
APMใ‚’ไฝฟใ†ใจใ‚นใ‚ญใƒซใ€ใƒ—ใƒญใƒณใƒ—ใƒˆใ€ใ‚คใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ทใƒงใƒณใ€ใƒ—ใƒฉใ‚ฐใ‚คใƒณใ€MCPใ‚ตใƒผใƒใƒผใ‚’apm.ymlใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใง็ฎก็†ใงใใพใ™ใ€‚

apm.ymlใฎไพ‹ใฏใ“ใ‚“ใชๆ„Ÿใ˜ใงใ™ใญใ€‚

# apm.yml โ€” ships with your project

name: your-project
version: 1.0.0
dependencies:
  apm:
    # Skills from any repository
    - anthropics/skills/skills/frontend-design
    # Plugins
    - github/awesome-copilot/plugins/context-engineering
    # Specific agent primitives from any repository
    - github/awesome-copilot/agents/api-architect.agent.md
    # A full APM package with instructions, skills, prompts, hooks...
    - microsoft/apm-sample-package#v1.0.0
  mcp:
    # MCP servers -- installed into every detected client
    - name: io.github.github/github-mcp-server
      transport: http   # MCP transport name, not URL scheme -- connects over HTTPS

ไปฅๅ‰ใ€Vercelใฎskillsใงใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฎใ‚นใ‚ญใƒซใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใŸใ‚Šใ—ใฆใฟใพใ—ใŸใ€‚

Vercelのskillsでエージェントのスキルをインストールする - CLOVER🍀

ใพใŸClaude Codeใงใ‚‚ใƒ—ใƒฉใ‚ฐใ‚คใƒณใจใ„ใ†ๅฝขใงใ‚นใ‚ญใƒซใชใฉใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใพใ™ใ€‚ใƒžใƒผใ‚ฑใƒƒใƒˆใƒ—ใƒฌใ‚คใ‚นใจใ„ใ†ๆฆ‚ๅฟตใ‚‚ใ‚ใ‚Šใพใ—ใŸใ€‚

Claude Codeのプラグインを試す+GitLabでマーケットプレイスを作成する - CLOVER🍀

ใ“ใ‚Œใ‚‰ใฎใƒ„ใƒผใƒซใฏใ‚นใ‚ญใƒซใชใฉใฎ่ฟฝๅŠ ใƒปๅ‰Š้™คใ‚’่กŒใฃใŸใ‚Šใ€็พๅœจใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ‚Œใฆใ„ใ‚‹ใ‚นใ‚ญใƒซใชใฉใฏ็ขบ่ชใงใใพใ™ใ—ใ€ใƒญใƒƒใ‚ฏใƒ•ใ‚กใ‚คใƒซใ‚‚
ใ‚ใ‚Šใพใ™ใ€‚ใŸใ ใ€ใ“ใ‚Œใฏ็พ็‰ฉ็ขบ่ชใซ่ฟ‘ใ„ใงใ™ใ€‚ใ“ใ“ใงAPMใ‚’ไฝฟใ†ใจใ€ใ‚นใ‚ญใƒซใชใฉใ‚’ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใจใ—ใฆ็ฎก็†ใงใใ‚‹ใ“ใจใซใชใ‚Šใพใ™ใ€‚
npmใ‚„pipใฎใ‚จใƒผใ‚ธใ‚งใƒณใƒˆๅ‘ใ‘ใฎใ‚‚ใฎใงใ™ใญใ€‚

ๅฏพๅฟœใ—ใฆใ„ใ‚‹ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฏไปฅไธ‹ใงใ™ใ€‚

  • GitHub Copilot
  • Claude Code
  • Cursor
  • OpenCode
  • Codex
  • Gemini
  • Windsurf

APMใฎใ‚ณใƒณใ‚ปใƒ—ใƒˆใฏใ“ใกใ‚‰ใ€‚

What is APM? | Agent Package Manager

ใ“ใ“ใงใฏAPMใŒไปฅไธ‹ใฎใ‚‚ใฎใ‚’็ฎก็†ใ™ใ‚‹ใจๆ›ธใ‹ใ‚Œใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฎใ“ใจใ‚’APMใงใฏใ€Œใƒ—ใƒชใƒŸใƒ†ใ‚ฃใƒ–ใ€ใจๅ‘ผใณใพใ™ใ€‚

  • ใ‚คใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ทใƒงใƒณ
  • ใ‚นใ‚ญใƒซ
  • ใƒ—ใƒญใƒณใƒ—ใƒˆ
  • ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ
  • ใƒ•ใƒƒใ‚ฏ
  • ใ‚ณใƒžใƒณใƒ‰
  • ใƒ—ใƒฉใ‚ฐใ‚คใƒณ
  • MCPใ‚ตใƒผใƒใƒผ

ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใŸใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใฏใƒใƒผใ‚ธใƒงใƒณใ‚„ใƒใƒƒใ‚ทใƒฅใŒ่จ˜้Œฒใ•ใ‚Œใพใ™ใ€‚

ๅ„ใƒ—ใƒชใƒŸใƒ†ใ‚ฃใƒ–ใŒๅ…ทไฝ“็š„ใซใฉใ†ใ„ใ†ใƒ•ใ‚กใ‚คใƒซใ‚’ๆŒ‡ใ—ใฆใ„ใฆใ€ๅ„ใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใ‚จใƒผใ‚ธใ‚งใƒณใƒˆๅ‘ใ‘ใซAPMใŒใฉใ†ใ‚ตใƒใƒผใƒˆใ—ใฆใ„ใ‚‹ใ‹ใฏ
ใ“ใกใ‚‰ใซๆ›ธใ‹ใ‚Œใฆใ„ใพใ™ใ€‚

Primitives and Targets | Agent Package Manager

ใ‚คใƒณใ‚นใƒˆใƒผใƒซๅฏพ่ฑกใฎใƒ—ใƒชใƒŸใƒ†ใ‚ฃใƒ–ใ‚’ใใฎใพใพไฝฟใˆใ‚‹ใ‚‚ใฎใ‚‚ใ‚ใ‚Œใฐ๏ผˆnative๏ผ‰ใ€APMใŒๅค‰ๆ›ใ™ใ‚‹ใ‚‚ใฎใ‚‚ใ‚ใฃใŸใ‚Š๏ผˆcompiled๏ผ‰ใ€ใ‚ตใƒใƒผใƒˆใ—ใฆใ„ใชใ„
ใ‚‚ใฎใ‚‚ใ‚ใ‚Šใพใ™ใ€‚

ใ•ใ‚‰ใซๅ„ใƒ—ใƒชใƒŸใƒ†ใ‚ฃใƒ–ใŒใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฎใฉใฎใƒ•ใ‚กใ‚คใƒซใซๅฏพๅฟœใ™ใ‚‹ใ‹ใฏไปฅไธ‹ใซๆ›ธใ‹ใ‚Œใฆใ„ใพใ™ใ€‚

Targets matrix | Agent Package Manager

ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใฏใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใฎๅˆฉ็”จ่€…ๅ‘ใ‘ใ€ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚’ไฝœๆˆใ—ใŸใ‚Šๅ…ฌ้–‹ใ—ใŸใ‚Šใ™ใ‚‹ไบบๅ‘ใ‘ใ€็ต„็น”ๅ†…ใงใฎใ‚ฌใƒใƒŠใƒณใ‚นใ‚’ๅŠนใ‹ใ›ใŸใ„ไบบๅ‘ใ‘ใซ
ใใ‚Œใžใ‚Œๆ›ธใ‹ใ‚Œใฆใ„ใพใ™ใŒใ€ไปŠๅ›žใฏๅˆฉ็”จ่€…็›ฎ็ทšใง่ฆ‹ใฆใ„ใใพใ™ใ€‚

Use APM packages | Agent Package Manager

็’ฐๅขƒ

ไปŠๅ›žใฎ็’ฐๅขƒใฏใ“ใกใ‚‰ใ€‚Ubuntu Linux 24.04 LTSใงใ™ใ€‚

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.4 LTS
Release:        24.04
Codename:       noble


$ uname -srvmpio
Linux 6.8.0-124-generic #124-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 13:00:45 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux

APMใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚‹

ใพใšใฏAPMใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ€‚

Quickstart | Agent Package Manager

Linuxใ€macOSใงใ‚ใ‚Œใฐcurl๏ผ‹bashใงใ€Windowsใงใ‚ใ‚Œใฐirm๏ผ‹iexใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ€‚

ไปŠๅ›žใฏUbuntu Linux 24.04 LTSใ‚’ๅฏพ่ฑกใจใ™ใ‚‹ใฎใงใ“ใกใ‚‰ใฎใ‚ณใƒžใƒณใƒ‰ใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใ€‚

$ curl -sSL https://aka.ms/apm-unix | sh

ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ‚Œใพใ—ใŸใ€‚

$ apm --version
Agent Package Manager (APM) CLI version 0.16.0 (e94af4a)

ใƒ˜ใƒซใƒ—ใ€‚

$ apm --help
Usage: apm [OPTIONS] COMMAND [ARGS]...

  Agent Package Manager (APM): The package manager for AI-Native Development

Options:
  --version  Show version and exit.
  --help     Show this message and exit.

Commands:
  audit         Scan installed packages for hidden Unicode characters
  cache         Manage the local package cache
  compile       Compile APM context into distributed AGENTS.md files
  config        Configure APM CLI
  deps          Manage APM package dependencies
  experimental  Manage experimental feature flags
  init          Initialize a new APM project
  install       Install APM and MCP dependencies (supports APM packages,...
  list          List available scripts in the current project
  marketplace   Manage marketplaces for discovery and governance
  mcp           Discover, inspect, and install MCP servers
  outdated      Show outdated locked dependencies
  pack          Pack distributable artifacts from your APM project.
  plugin        Scaffold and manage plugins (plugin-author workflows)
  policy        Inspect and diagnose APM policy
  preview       Preview a script's compiled prompt files
  prune         Remove APM packages not listed in apm.yml
  publish       Publish a package to a registry.
  run           Run a script with parameters (experimental)
  runtime       Manage AI runtimes (experimental)
  search        Search plugins in a marketplace (QUERY@MARKETPLACE)
  self-update   Update the APM CLI binary itself to the latest version
  targets       Show resolved targets for the current project.
  uninstall     Remove APM packages, their integrated files, and apm.yml...
  unpack        [Deprecated] Extract an APM bundle into the current project.
  update        Refresh APM dependencies to the latest matching refs
  view          View package metadata or list remote versions

ใ‚คใƒณใ‚นใƒˆใƒผใƒซๅ…ˆใฏ/usr/local/binใงใ—ใŸใ€‚$HOME/.local/binใงใฏใชใ„ใ‚“ใงใ™ใญใ€‚

$ which apm
/usr/local/bin/apm


$ ls -l $(which apm)
lrwxrwxrwx 1 root root 22  5ๆœˆ 31 20:39 /usr/local/bin/apm -> /usr/local/lib/apm/apm

ๅฎŸ่กŒๅฏ่ƒฝใƒใ‚คใƒŠใƒชใƒผใŒ็ฝฎใ‹ใ‚Œใ‚‹ใ ใ‘ใฎใ‚ˆใ†ใงใ™ใ€‚

$ file /usr/local/lib/apm/apm
/usr/local/lib/apm/apm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=f5e4eb9bd95f0a14f41d1ef1a6f8ee703c85a059, stripped


$ ldd /usr/local/lib/apm/apm
        linux-vdso.so.1 (0x00007ffd02593000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007296b7d10000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007296b7cf4000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007296b7cef000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007296b7a00000)
        /lib64/ld-linux-x86-64.so.2 (0x00007296b7d1d000)

APM่‡ช่บซใฎใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใฏself-updateใ‚ณใƒžใƒณใƒ‰ใงใ€‚

$ apm self-update

APMใ‚’ไฝฟใฃใฆใฟใ‚‹

ๅˆฉ็”จ่€…ใจใ—ใฆใฎAPMใฎไฝฟใ„ๆ–นใฎๅŸบๆœฌใฏใ“ใกใ‚‰ใ€‚

  • apm initใ‚ณใƒžใƒณใƒ‰ใงAPMใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ™ใ‚‹
  • apm instlal ๏ผœใƒ‘ใƒƒใ‚ฑใƒผใ‚ธ๏ผžใงไพๅญ˜้–ขไฟ‚ใ‚’่ฟฝๅŠ ใ™ใ‚‹
  • apm installใงapm.lock.ymlใƒ•ใ‚กใ‚คใƒซใซๅพ“ใฃใฆ็’ฐๅขƒใ‚’ใƒชใ‚นใƒˆใ‚ขใ™ใ‚‹
  • apm run ๏ผœใ‚นใ‚ฏใƒชใƒ—ใƒˆ๏ผžใงapm.ymlใซๅฎฃ่จ€ใ•ใ‚ŒใŸใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ๅ‘ผใณๅ‡บใ™

Use APM packages / The consumer flow

ใพใšใฏapm initใ‚ณใƒžใƒณใƒ‰ใงใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ—ใพใ™ใ€‚

$ apm init --help
Usage: apm init [OPTIONS] [PROJECT_NAME]

  Initialize a new APM project

Options:
  -y, --yes        Skip interactive prompts and use auto-detected defaults
  --plugin         (deprecated) Use 'apm plugin init' instead. Scaffolds
                   plugin.json + apm.yml.
  --marketplace    (deprecated) Use 'apm marketplace init' instead. Seeds a
                   marketplace block.
  --target TARGET  Comma-separated target list (skip prompt, write directly)
  -v, --verbose    Show detailed output
  --help           Show this message and exit.

ไฝฟใฃใฆใฟใ‚‹ใจใ‚ใ‹ใ‚Šใพใ™ใŒใ€apm initใซใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใจๆ–ฐใ—ใ„ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆ๏ผˆใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใƒผ๏ผ‰ใ‚’ไฝœๆˆใ—ใ€ๆŒ‡ๅฎšใ—ใชใ„ๅ ดๅˆใฏ
ใ‚ซใƒฌใƒณใƒˆใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใƒผใ‚’ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใจใ—ใฆๆ‰ฑใ†ใ‚ˆใ†ใงใ™ใ€‚

ไปŠๅ›žใฏใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅใ‚’ๆŒ‡ๅฎšใ—ใฆใฟใพใ™ใ€‚

$ apm init apm-test

ๅฏพ่ฉฑๅฝขๅผใงใ„ใ‚ใ„ใ‚ใจ่žใ‹ใ‚Œใพใ—ใŸใŒใ€ใปใผใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฎใพใพใซใ—ใพใ—ใŸใ€‚ใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฏClaude Codeใซใ—ใฆใ„ใพใ™ใ€‚

[>] Created project directory: apm-test

Setting up your APM project...
Press ^C at any time to quit.

Project name (apm-test):
Version (1.0.0):
Description (APM project for apm-test):
Author (Developer):

Select targets for this project:
  1. [ ] copilot
  2. [ ] claude
  3. [ ] cursor
  4. [ ] opencode
  5. [ ] codex
  6. [ ] gemini
  7. [ ] windsurf
  (no signals detected)

[i] Tip: select the tools your team uses. You can change this later
    with 'apm targets set <target,...>' or edit apm.yml directly.
[i] Type a number to toggle, ranges like '1-3' or '1,3,5' for multiple,
    'all' / 'none' to flip every entry, or press Enter to confirm.
Toggle (1-7, ranges, 'all'/'none', or Enter to confirm): 2
  1. [ ] copilot
  2. [x] claude
  3. [ ] cursor
  4. [ ] opencode
  5. [ ] codex
  6. [ ] gemini
  7. [ ] windsurf
Toggle (1-7, ranges, 'all'/'none', or Enter to confirm):
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ About to create โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ name: apm-test                                                                                                                                                              โ”‚
โ”‚ version: 1.0.0                                                                                                                                                              โ”‚
โ”‚ description: APM project for apm-test                                                                                                                                       โ”‚
โ”‚ author: Developer                                                                                                                                                           โ”‚
โ”‚ targets: claude                                                                                                                                                             โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

Is this OK? [y/n] (y):
[>] Initializing APM project: apm-test
[*] APM project initialized successfully!
    Created Files
โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ File โ”ƒ Description โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ *    โ”‚ apm.yml     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  Next Steps โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ * Install a package:               apm install <owner>/<repo>                                                                                                               โ”‚
โ”‚ * Run a script:                    apm run <script>                                                                                                                         โ”‚
โ”‚ * Build a plugin? Scaffold one:    apm plugin init                                                                                                                          โ”‚
โ”‚ * Publishing a marketplace?:       apm marketplace init                                                                                                                     โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
  Docs: https://microsoft.github.io/apm  |  Star: https://github.com/microsoft/apm

ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ†…ใธ็งปๅ‹•ใ€‚

$ cd apm-test

apm.ymlใŒใงใใฆใ„ใพใ™ใ€‚

$ tree -a
.
โ””โ”€โ”€ apm.yml

1 directory, 1 file

ไธญ่บซใฏใ“ใ†ใงใ—ใŸใ€‚

apm.yml

name: apm-test
version: 1.0.0
description: APM project for apm-test
author: Developer
# Which agent platforms to deploy to.
# Resolution order: --target flag > this field > auto-detect from filesystem.
# Accepted values: copilot, claude, cursor, opencode, codex, gemini, windsurf, all
targets:
- claude
dependencies:
  apm: []
  mcp: []
includes: auto
scripts: {}

ใงใฏใ€ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

Install packages | Agent Package Manager

apm installใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚‹ใ‚ˆใ†ใงใ™ใ€‚่จ˜่ฟฐๆ–นๆณ•ใฏไปฅไธ‹ใฎใ‚คใƒกใƒผใ‚ธใงใ€‚

$ apm install microsoft/apm-sample-package#v1.0.0
$ apm install github/awesome-copilot/skills/review-and-refactor
$ apm install ./packages/my-shared-skills        # local path
$ apm install --dev acme/internal-debug-agents   # devDependencies

ใŠ้กŒใฏใ“ใฎใ‚ใŸใ‚Šใซใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

GitHub - anthropics/skills: Public repository for Agent Skills · GitHub

GitHub - hashicorp/agent-skills: A collection of Agent skills and Claude Code plugins for HashiCorp products. · GitHub

ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ€‚

$ apm install anthropics/skills

ใ“ใ‚“ใชๆ„Ÿใ˜ใซใชใ‚Šใพใ—ใŸใ€‚

[*] Validating 1 package...
[+] anthropics/skills
[*] Updated apm.yml with 1 new package(s)
[>] Installing 1 new package...
[>] Resolving anthropics/skills...
[i] Targets: claude  (source: apm.yml)
  [+] anthropics/skills @da20c925
  |-- Skill integrated -> .agents/skills/, .claude/skills/
  |-- 17 skill(s) integrated -> .agents/skills/, .claude/skills/
[i] Added apm_modules/ to .gitignore
  [!] 1 dependency unpinned: anthropics/skills -- add #tag or #sha to prevent drift
[*] Installed 1 APM dependency in 4.9s.

apm.yml

name: apm-test
version: 1.0.0
description: APM project for apm-test
author: Developer
targets:
- claude
dependencies:
  apm:
  - anthropics/skills
  mcp: []
includes: auto
scripts: {}

.agentsใจ.claudeใซใใ‚Œใžใ‚Œๅฑ•้–‹ใ•ใ‚ŒใŸใ‚ˆใ†ใงใ™ใญใ€‚ใใ—ใฆanthropics/skillsใซๅซใพใ‚Œใ‚‹ใ‚นใ‚ญใƒซใŒใ™ในใฆๅ…ฅใฃใฆใ„ใพใ™ใ€‚

$ tree -a -L 3
.
โ”œโ”€โ”€ .agents
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ”œโ”€โ”€ algorithmic-art
โ”‚ย ย      โ”œโ”€โ”€ brand-guidelines
โ”‚ย ย      โ”œโ”€โ”€ canvas-design
โ”‚ย ย      โ”œโ”€โ”€ claude-api
โ”‚ย ย      โ”œโ”€โ”€ doc-coauthoring
โ”‚ย ย      โ”œโ”€โ”€ docx
โ”‚ย ย      โ”œโ”€โ”€ frontend-design
โ”‚ย ย      โ”œโ”€โ”€ internal-comms
โ”‚ย ย      โ”œโ”€โ”€ mcp-builder
โ”‚ย ย      โ”œโ”€โ”€ pdf
โ”‚ย ย      โ”œโ”€โ”€ pptx
โ”‚ย ย      โ”œโ”€โ”€ skill-creator
โ”‚ย ย      โ”œโ”€โ”€ slack-gif-creator
โ”‚ย ย      โ”œโ”€โ”€ theme-factory
โ”‚ย ย      โ”œโ”€โ”€ web-artifacts-builder
โ”‚ย ย      โ”œโ”€โ”€ webapp-testing
โ”‚ย ย      โ””โ”€โ”€ xlsx
โ”œโ”€โ”€ .claude
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ”œโ”€โ”€ algorithmic-art
โ”‚ย ย      โ”œโ”€โ”€ brand-guidelines
โ”‚ย ย      โ”œโ”€โ”€ canvas-design
โ”‚ย ย      โ”œโ”€โ”€ claude-api
โ”‚ย ย      โ”œโ”€โ”€ doc-coauthoring
โ”‚ย ย      โ”œโ”€โ”€ docx
โ”‚ย ย      โ”œโ”€โ”€ frontend-design
โ”‚ย ย      โ”œโ”€โ”€ internal-comms
โ”‚ย ย      โ”œโ”€โ”€ mcp-builder
โ”‚ย ย      โ”œโ”€โ”€ pdf
โ”‚ย ย      โ”œโ”€โ”€ pptx
โ”‚ย ย      โ”œโ”€โ”€ skill-creator
โ”‚ย ย      โ”œโ”€โ”€ slack-gif-creator
โ”‚ย ย      โ”œโ”€โ”€ theme-factory
โ”‚ย ย      โ”œโ”€โ”€ web-artifacts-builder
โ”‚ย ย      โ”œโ”€โ”€ webapp-testing
โ”‚ย ย      โ””โ”€โ”€ xlsx
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ apm.lock.yaml
โ”œโ”€โ”€ apm.yml
โ””โ”€โ”€ apm_modules
    โ””โ”€โ”€ anthropics
        โ””โ”€โ”€ skills

42 directories, 3 files

ใƒญใƒƒใ‚ฏใƒ•ใ‚กใ‚คใƒซใ€‚

apm.lock.yaml

lockfile_version: '1'
generated_at: '2026-05-31T11:58:52.844136+00:00'
apm_version: 0.16.0
dependencies:
- repo_url: anthropics/skills
  host: github.com
  resolved_commit: da20c92503b2e8ff1cf28ca81a0df4673debdbf7
  package_type: marketplace_plugin
  deployed_files:
  - .agents/skills/algorithmic-art
  - .agents/skills/brand-guidelines
  - .agents/skills/canvas-design
  - .agents/skills/claude-api
  - .agents/skills/doc-coauthoring
  - .agents/skills/docx
  - .agents/skills/frontend-design
  - .agents/skills/internal-comms
  - .agents/skills/mcp-builder
  - .agents/skills/pdf
  - .agents/skills/pptx
  - .agents/skills/skill-creator
  - .agents/skills/slack-gif-creator
  - .agents/skills/theme-factory
  - .agents/skills/web-artifacts-builder
  - .agents/skills/webapp-testing
  - .agents/skills/xlsx
  - .claude/skills/algorithmic-art
  - .claude/skills/brand-guidelines
  - .claude/skills/canvas-design
  - .claude/skills/claude-api
  - .claude/skills/doc-coauthoring
  - .claude/skills/docx
  - .claude/skills/frontend-design
  - .claude/skills/internal-comms
  - .claude/skills/mcp-builder
  - .claude/skills/pdf
  - .claude/skills/pptx
  - .claude/skills/skill-creator
  - .claude/skills/slack-gif-creator
  - .claude/skills/theme-factory
  - .claude/skills/web-artifacts-builder
  - .claude/skills/webapp-testing
  - .claude/skills/xlsx
  content_hash: sha256:5a94c4600dca371e7571be73552f06e11293f558b3d3b295d306b0bfefb4245b

1ๅบฆใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚’ใ‚ขใƒณใ‚คใƒณใ‚นใƒˆใƒผใƒซใ€‚

$ apm uninstall anthropics/skills
[>] Uninstalling 1 package(s)...
[+] anthropics/skills - found in apm.yml
[i] Removed anthropics/skills from apm.yml
[*] Updated /path/to/apm-test/apm.yml (removed 1 package(s))
[i] Removed anthropics/skills from apm_modules/
[+] Cleaned up 17 integrated skills
[*] Uninstall complete: Removed 1 package(s) from apm.yml, Removed 1 package(s) from apm_modules/

apm.ymlใ‹ใ‚‰ไพๅญ˜้–ขไฟ‚ใŒใชใใชใ‚Šใพใ—ใŸใ€‚

apm.yml

name: apm-test
version: 1.0.0
description: APM project for apm-test
author: Developer
targets:
- claude
dependencies:
  apm: []
  mcp: []
includes: auto
scripts: {}

ใƒ•ใ‚กใ‚คใƒซใ‚‚ใชใใชใฃใฆใ„ใ‚‹โ€ฆใจๆ€ใ„ใใ‚„ใ€.agentsใฎๆ–นใซใฏๆฎ‹ใฃใฆใ„ใพใ™โ€ฆใ€‚

$ tree -a -L 3
.
โ”œโ”€โ”€ .agents
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ”œโ”€โ”€ algorithmic-art
โ”‚ย ย      โ”œโ”€โ”€ brand-guidelines
โ”‚ย ย      โ”œโ”€โ”€ canvas-design
โ”‚ย ย      โ”œโ”€โ”€ claude-api
โ”‚ย ย      โ”œโ”€โ”€ doc-coauthoring
โ”‚ย ย      โ”œโ”€โ”€ docx
โ”‚ย ย      โ”œโ”€โ”€ frontend-design
โ”‚ย ย      โ”œโ”€โ”€ internal-comms
โ”‚ย ย      โ”œโ”€โ”€ mcp-builder
โ”‚ย ย      โ”œโ”€โ”€ pdf
โ”‚ย ย      โ”œโ”€โ”€ pptx
โ”‚ย ย      โ”œโ”€โ”€ skill-creator
โ”‚ย ย      โ”œโ”€โ”€ slack-gif-creator
โ”‚ย ย      โ”œโ”€โ”€ theme-factory
โ”‚ย ย      โ”œโ”€โ”€ web-artifacts-builder
โ”‚ย ย      โ”œโ”€โ”€ webapp-testing
โ”‚ย ย      โ””โ”€โ”€ xlsx
โ”œโ”€โ”€ .claude
โ”‚ย ย  โ””โ”€โ”€ skills
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ apm.yml
โ””โ”€โ”€ apm_modules

23 directories, 2 files

ใ“ใกใ‚‰ใฏๆ‰‹ๅ‹•ใงๅ‰Š้™คโ€ฆใ€‚

$ rm -rf .agents/skills/*

ไปŠๅบฆใฏๅ˜ไธ€ใฎใ‚นใ‚ญใƒซใ‚’้ธใ‚“ใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใฟใพใ™ใ€‚

$ apm install anthropics/skills/skills/skill-creator
[*] Validating 1 package...
[+] anthropics/skills/skills/skill-creator
[*] Updated apm.yml with 1 new package(s)
[>] Installing 1 new package...
[>] Resolving skills-skill-creator...
[i] Targets: claude  (source: apm.yml)
  [+] github.com/anthropics/skills/skills/skill-creator @da20c925
  |-- Skill integrated -> .claude/skills/
  [!] 1 dependency unpinned: anthropics/skills -- add #tag or #sha to prevent drift
[*] Installed 1 APM dependency in 3.2s.

apm.yml

name: apm-test
version: 1.0.0
description: APM project for apm-test
author: Developer
targets:
- claude
dependencies:
  apm:
  - anthropics/skills/skills/skill-creator
  mcp: []
includes: auto
scripts: {}

้ข็™ฝใ„ใ“ใจใซใ€ใ“ใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซๆ–นๆณ•ใ ใจ.agentsใซใฏใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ‚Œใชใใชใ‚Šใพใ—ใŸโ€ฆใ€‚

$ tree -a -L 3
.
โ”œโ”€โ”€ .agents
โ”‚ย ย  โ””โ”€โ”€ skills
โ”œโ”€โ”€ .claude
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ””โ”€โ”€ skill-creator
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ apm.lock.yaml
โ”œโ”€โ”€ apm.yml
โ””โ”€โ”€ apm_modules
    โ””โ”€โ”€ anthropics
        โ””โ”€โ”€ skills

9 directories, 3 files

ใ‚‚ใ†ๅฐ‘ใ—่ฟฝๅŠ ใ—ใฆใฟใพใ™ใ€‚

$ apm install hashicorp/agent-skills/terraform/code-generation/skills/terraform-style-guide
[*] Validating 1 package...
[+] hashicorp/agent-skills/terraform/code-generation/skills/terraform-style-guide
[*] Updated apm.yml with 1 new package(s)
[>] Installing 1 new package...
[i] Targets: claude  (source: apm.yml)
  [+] github.com/hashicorp/agent-skills/terraform/code-generation/skills/terraform-style-guide #default @339a1139
  |-- Skill integrated -> .claude/skills/
  [!] 1 dependency unpinned: hashicorp/agent-skills -- add #tag or #sha to prevent drift
[*] Installed 1 APM dependency in 2.6s.
$ tree -a -L 3
.
โ”œโ”€โ”€ .agents
โ”‚ย ย  โ””โ”€โ”€ skills
โ”œโ”€โ”€ .claude
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ”œโ”€โ”€ skill-creator
โ”‚ย ย      โ””โ”€โ”€ terraform-style-guide
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ apm.lock.yaml
โ”œโ”€โ”€ apm.yml
โ””โ”€โ”€ apm_modules
    โ”œโ”€โ”€ anthropics
    โ”‚ย ย  โ””โ”€โ”€ skills
    โ””โ”€โ”€ hashicorp
        โ””โ”€โ”€ agent-skills

12 directories, 3 files

apm.yml

name: apm-test
version: 1.0.0
description: APM project for apm-test
author: Developer
targets:
- claude
dependencies:
  apm:
  - anthropics/skills/skills/skill-creator
  - hashicorp/agent-skills/terraform/code-generation/skills/terraform-style-guide
  mcp: []
includes: auto
scripts: {}

ใ ใ„ใŸใ„ๆ„Ÿ่ฆšใŒใ‚ใ‹ใฃใฆใใพใ—ใŸใญใ€‚

apm installใงใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚’ไธ€ๆ‹ฌใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚‹

ใ“ใ“ใงใ€1ๅบฆ.agentsใŠใ‚ˆใณ.claudeใ€apm_modulesใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใƒผใ‚’ๅ‰Š้™คใ—ใฆใŠใใพใ™ใ€‚

$ rm -rf .agents .claude apm_modules

ใกใชใฟใซapm_modulesใจใ„ใ†ใฎใฏใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚ญใƒฃใƒƒใ‚ทใƒฅใงใ™ใ€‚

apm_modules/
โ”œโ”€โ”€ anthropics
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ””โ”€โ”€ skills
โ”‚ย ย          โ””โ”€โ”€ skill-creator
โ”‚ย ย              โ”œโ”€โ”€ LICENSE.txt
โ”‚ย ย              โ”œโ”€โ”€ SKILL.md
โ”‚ย ย              โ”œโ”€โ”€ agents
โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ analyzer.md
โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ comparator.md
โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ grader.md
โ”‚ย ย              โ”œโ”€โ”€ assets
โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ eval_review.html
โ”‚ย ย              โ”œโ”€โ”€ eval-viewer
โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ generate_review.py
โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ viewer.html
โ”‚ย ย              โ”œโ”€โ”€ references
โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ schemas.md
โ”‚ย ย              โ””โ”€โ”€ scripts
โ”‚ย ย                  โ”œโ”€โ”€ __init__.py
โ”‚ย ย                  โ”œโ”€โ”€ aggregate_benchmark.py
โ”‚ย ย                  โ”œโ”€โ”€ generate_report.py
โ”‚ย ย                  โ”œโ”€โ”€ improve_description.py
โ”‚ย ย                  โ”œโ”€โ”€ package_skill.py
โ”‚ย ย                  โ”œโ”€โ”€ quick_validate.py
โ”‚ย ย                  โ”œโ”€โ”€ run_eval.py
โ”‚ย ย                  โ”œโ”€โ”€ run_loop.py
โ”‚ย ย                  โ””โ”€โ”€ utils.py
โ””โ”€โ”€ hashicorp
    โ””โ”€โ”€ agent-skills
        โ””โ”€โ”€ terraform
            โ””โ”€โ”€ code-generation
                โ””โ”€โ”€ skills
                    โ””โ”€โ”€ terraform-style-guide
                        โ”œโ”€โ”€ SECURITY.md
                        โ””โ”€โ”€ SKILL.md

ใ“ใ‚Œใงapm.ymlใจapm.lock.yamlใƒ•ใ‚กใ‚คใƒซใ ใ‘ใŒใ‚ใ‚‹็Šถๆ…‹ใซใชใ‚Šใพใ™ใ€‚

$ tree -a
.
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ apm.lock.yaml
โ””โ”€โ”€ apm.yml

1 directory, 3 files

ใ“ใ“ใงapm installใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจใ€ใ“ใ‚Œใ‚‰ใฎใƒ•ใ‚กใ‚คใƒซใซๆ›ธใ‹ใ‚ŒใŸไพๅญ˜้–ขไฟ‚ใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใใ‚Œใพใ™ใ€‚

$ apm install
[>] Installing dependencies from apm.yml...
[>] Resolving skills-skill-creator...
[>] Resolving agent-skills-terraform-style-guide...
[i] Targets: claude  (source: apm.yml)
  [+] github.com/anthropics/skills/skills/skill-creator @da20c925
  |-- Skill integrated -> .agents/skills/, .claude/skills/
  [+] github.com/hashicorp/agent-skills/terraform/code-generation/skills/terraform-style-guide @339a1139
  |-- Skill integrated -> .agents/skills/, .claude/skills/
  [!] 2 dependencies unpinned: anthropics/skills, hashicorp/agent-skills -- add #tag or #sha to prevent drift
[*] Installed 2 APM dependencies in 0.1s.


$ tree -a -L 3
.
โ”œโ”€โ”€ .agents
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ”œโ”€โ”€ skill-creator
โ”‚ย ย      โ””โ”€โ”€ terraform-style-guide
โ”œโ”€โ”€ .claude
โ”‚ย ย  โ””โ”€โ”€ skills
โ”‚ย ย      โ”œโ”€โ”€ skill-creator
โ”‚ย ย      โ””โ”€โ”€ terraform-style-guide
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ apm.lock.yaml
โ”œโ”€โ”€ apm.yml
โ””โ”€โ”€ apm_modules
    โ”œโ”€โ”€ anthropics
    โ”‚ย ย  โ””โ”€โ”€ skills
    โ””โ”€โ”€ hashicorp
        โ””โ”€โ”€ agent-skills

14 directories, 3 files

ๅฐŽๅ…ฅ็š„ใชไฝฟใ„ๆ–นใฏใ‚ใ‹ใฃใŸๆ„Ÿใ˜ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใŠใ‚ใ‚Šใซ

MicrosoftใŒ้–‹็™บใ—ใฆใ„ใ‚‹AIใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ็”จใฎใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใƒžใƒใƒผใ‚ธใƒฃใƒผใ€APM๏ผˆAgent Package Manager๏ผ‰ใ‚’่ฉฆใ—ใฆใ„ใพใ—ใŸใ€‚

ไปŠๅ›žใฏใ‚นใ‚ญใƒซใง่ฉฆใ—ใฆใฟใพใ—ใŸใŒใ€ใ“ใ†ใ„ใ†ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใงๅ†ๅˆฉ็”จใงใใใ†ใชใ‚‚ใฎใฏใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใจใ—ใฆๆ‰ฑใ‚ใ‚Œใฆ็ฎก็†ใ•ใ‚Œใฆใ„ใๆ„Ÿใ˜ใซ
ใชใ‚‹ใฎใงใ—ใ‚‡ใ†ใญใ€‚ใพใ ใพใ ๆ‰‹ๆŽขใ‚Šใช็Šถๆ…‹ใ‹ใชใจใฏๆ€ใ„ใพใ™ใŒใ€‚

RustใงCSVใ‚’ๆ‰ฑใ†

ใ“ใ‚Œใฏใ€ใชใซใ‚’ใ—ใŸใใฆๆ›ธใ„ใŸใ‚‚ใฎ๏ผŸ

RustใงCSVใ‚’ๆ‰ฑใฃใฆใฟใพใ—ใ‚‡ใ†ใ€ใจใ„ใ†ใ“ใจใงใ€‚

csvใ‚ฏใƒฌใƒผใƒˆ

RustใงCSVใ‚’ไฝฟใ†ใซใฏใ€csvใ‚ฏใƒฌใƒผใƒˆใ‚’ไฝฟใ„ใพใ™ใ€‚

csv - Rust

GitHubใƒชใƒใ‚ธใƒˆใƒชใƒผใฏใ“ใกใ‚‰ใ€‚

GitHub - BurntSushi/rust-csv: A CSV parser for Rust, with Serde support. · GitHub

csvใ‚ฏใƒฌใƒผใƒˆใฏSerdeใฎๅฎŸ่ฃ…ใฎใฒใจใคใงใ‚‚ใ‚ใ‚Šใพใ™ใ€‚

Overview · Serde

ๆœ€ๅˆใฏใƒใƒฅใƒผใƒˆใƒชใ‚ขใƒซใ‚’่ชญใ‚€ใฎใŒใ‚ˆใ„ใจใ•ใ‚Œใฆใ„ใพใ™ใ€‚

csv::tutorial - Rust

Serdeใ‚’ไฝฟใฃใฆใ„ใชใ„ๅ ดๅˆใฏๆจ™ๆบ–ใฎใƒฌใ‚ณใƒผใƒ‰ใ‚ฟใ‚คใƒ—ใฏStringRecordใŠใ‚ˆใณByteRecordใงใ™ใ€‚

Unless youโ€™re using Serde, the standard CSV record types are StringRecord and ByteRecord. StringRecord should be used when you know your data to be valid UTF-8.

Serdeใ‚’ไฝฟใ†ใจใ€ใƒ‡ใƒผใ‚ฟใ‚’็‹ฌ่‡ชใฎๆง‹้€ ไฝ“ใซใƒžใƒƒใƒ”ใƒณใ‚ฐใงใใพใ™ใ€‚

่ฆ‹ใฆใŠใๆง‹้€ ไฝ“ใฏใ“ใฎใ‚ใŸใ‚Šใงใ—ใ‚‡ใ†ใ‹ใ€‚

Reader in csv - Rust

ReaderBuilder in csv - Rust

Writer in csv - Rust

WriterBuilder in csv - Rust

็’ฐๅขƒ

ไปŠๅ›žใฎ็’ฐๅขƒใฏใ“ใกใ‚‰ใ€‚

$ rustup --version
rustup 1.29.0 (28d1352db 2026-03-05)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: the currently active `rustc` version is `rustc 1.95.0 (59807616e 2026-04-14)`

ๆบ–ๅ‚™

Cargoใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใฎไฝœๆˆใ€‚

$ cargo new --lib --vcs none serde-csv-getting-started
$ cd serde-csv-getting-started

ใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใ‚ฏใƒฌใƒผใƒˆใจใ—ใฆไฝœๆˆใ—ใฆใ„ใพใ™ใŒใ€็ขบ่ชใฏใƒใ‚คใƒŠใƒชใƒผใ‚ฏใƒฌใƒผใƒˆใ‚’ๅข—ใ‚„ใ—ใฆ่กŒใ†ใ“ใจใซใ—ใพใ™ใ€‚

$ mkdir src/bin

ใ‚ฏใƒฌใƒผใƒˆใ‚’่ฟฝๅŠ ใ€‚

$ cargo add csv
$ cargo add serde --features derive

serdeใ‚ฏใƒฌใƒผใƒˆใฏใ€ๆง‹้€ ไฝ“ใฎใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใ€ใƒ‡ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใ‚’ไฝฟใ†ๅ ดๅˆใซใฏ่ฟฝๅŠ ใ—ใพใ™ใ€‚

Cargo.toml

[package]
name = "serde-csv-getting-started"
version = "0.1.0"
edition = "2024"

[dependencies]
csv = "1.4.0"
serde = { version = "1.0.228", features = ["derive"] }

csvใ‚ฏใƒฌใƒผใƒˆใงCSVใ‚’่ชญใฟ่พผใ‚€

ใพใšใฏCSVใฎ่ชญใฟ่พผใฟใ‹ใ‚‰ใ‚„ใฃใฆใฟใพใ—ใ‚‡ใ†ใ€‚

ใƒใƒฅใƒผใƒˆใƒชใ‚ขใƒซใงๅ‚็…งใ™ใ‚‹ใฎใฏใ“ใกใ‚‰ใงใ™ใ€‚

Module tutorial / Reading CSV

ๆœ€ๅˆใฏSerdeใ‚’ไฝฟใ‚ใชใ„ใ‚ทใƒณใƒ—ใƒซใชใƒ‘ใ‚ฟใƒผใƒณใงๆ›ธใ„ใฆใฟใพใ™ใ€‚ใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณๅผ•ๆ•ฐใซใƒ•ใ‚กใ‚คใƒซใƒ‘ใ‚นใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใ‚Œใฐ
ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ใ€ๅผ•ๆ•ฐใชใ—ใฎๅ ดๅˆใฏๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰่ชญใฟ่พผใ‚€ใ‚ˆใ†ใซใ—ใฆใฟใพใ—ใŸใ€‚

src/bin/read_simple.rs

use std::{
    env::args,
    fs::File,
    io::{self, Read},
};

use csv::{Reader, StringRecord};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut rdr: Reader<Box<dyn Read>> = if args().len() > 1 {
        csv::Reader::from_reader(Box::new(File::open(args().nth(1).unwrap())?))
    } else {
        csv::Reader::from_reader(Box::new(io::stdin()))
    };

    for result in rdr.records() {
        let record = result?;
        println!("record: {:?}", record);

        let sr = record as StringRecord;
        println!(
            "first field: {}, second field: {}, third field: {}",
            &sr[0], &sr[1], &sr[2]
        );
    }

    Ok(())
}

Readerใฏใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ่จญๅฎšใงไฝœๆˆใ—ใฆใ„ใพใ™ใ€‚

    let mut rdr: Reader<Box<dyn Read>> = if args().len() > 1 {
        csv::Reader::from_reader(Box::new(File::open(args().nth(1).unwrap())?))
    } else {
        csv::Reader::from_reader(Box::new(io::stdin()))
    };

Readerใ‹ใ‚‰ใฏใƒฌใ‚ณใƒผใƒ‰ใ‚’ใ‚คใƒ†ใƒฌใƒผใ‚ทใƒงใƒณใงใใพใ™ใ€‚

    for result in rdr.records() {
        let record = result?;
        println!("record: {:?}", record);

        let sr = record as StringRecord;
        println!(
            "first field: {}, second field: {}, third field: {}",
            &sr[0], &sr[1], &sr[2]
        );
    }

ใƒฌใ‚ณใƒผใƒ‰ใ‚’ใกใ‚ƒใ‚“ใจใ—ใŸๅž‹ใงๆ‰ฑใ†ๅ ดๅˆใฏใ€StringRecordใซใ‚ญใƒฃใ‚นใƒˆใ—ใฆๆ‰ฑใ„ใพใ™ใ€‚ๅ„ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซใ‚ขใ‚ฏใ‚ปใ‚นใ™ใ‚‹้š›ใฏใ€
ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใงใฎใ‚ขใ‚ฏใ‚ปใ‚นใซใชใ‚Šใพใ™ใญใ€‚

StringRecord in csv - Rust

ๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰่ชญใฟ่พผใฟใ€‚

$ echo -e "field1,field2,field3\nJava,\"Rust\",Python\n\"MySQL\",Elasticsearch,Redis" | cargo run --bin read_simple
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/read_simple`
record: StringRecord(["Java", "Rust", "Python"])
first field: Java, second field: Rust, third field: Python
record: StringRecord(["MySQL", "Elasticsearch", "Redis"])
first field: MySQL, second field: Elasticsearch, third field: Redis

StringRecordใจใ—ใฆ่งฃ้‡ˆใ•ใ‚Œใฆใ„ใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚Šใพใ™ใญใ€‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงใ€1่กŒ็›ฎใฏใƒ˜ใƒƒใƒ€ใƒผใจใฟใชใ•ใ‚Œใพใ™ใ€‚
"ใงๅ›ฒใฃใŸๅ ดๅˆใ‚‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใง่งฃ้‡ˆใ—ใฆใใ‚Œใ‚‹ใ‚ˆใ†ใงใ™ใ€‚

ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰่ชญใฟ่พผใ‚“ใงใฟใพใ™ใ€‚

input/people.csv

first_name,last_name,age
ใ‚ซใƒ„ใ‚ช,"็ฃฏ้‡Ž",11
"ใƒฏใ‚ซใƒก",็ฃฏ้‡Ž,9
ใ‚ฟใƒฉใ‚ช,ใƒ•ใ‚ฐ็”ฐ,"3"

ๅฎŸ่กŒใ€‚

$ cargo run --bin read_simple input/people.csv
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/read_simple input/people.csv`
record: StringRecord(["ใ‚ซใƒ„ใ‚ช", "็ฃฏ้‡Ž", "11"])
first field: ใ‚ซใƒ„ใ‚ช, second field: ็ฃฏ้‡Ž, third field: 11
record: StringRecord(["ใƒฏใ‚ซใƒก", "็ฃฏ้‡Ž", "9"])
first field: ใƒฏใ‚ซใƒก, second field: ็ฃฏ้‡Ž, third field: 9
record: StringRecord(["ใ‚ฟใƒฉใ‚ช", "ใƒ•ใ‚ฐ็”ฐ", "3"])
first field: ใ‚ฟใƒฉใ‚ช, second field: ใƒ•ใ‚ฐ็”ฐ, third field: 3

ใ‚ˆใ•ใใ†ใงใ™ใ€‚

ๆฌกใฏSerdeใจ็ต„ใฟๅˆใ‚ใ›ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

Module tutorial / Reading CSV / Reading with Serde

ใƒ‡ใƒผใ‚ฟใ‚’ใƒžใƒƒใƒ”ใƒณใ‚ฐใ™ใ‚‹ๆง‹้€ ไฝ“ใ‚’ๅฎš็พฉใ—ใพใ™ใ€‚

src/lib.rs

use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize)]
pub struct Person {
    pub first_name: String,
    pub last_name: String,
    pub age: i32,
}

่ชญใฟ่พผใฟใ ใ‘ใงไฝฟใ†ใฎใชใ‚‰Deserializeใงใ‚ใ‚Œใฐใ„ใ„ใฎใงใ™ใŒใ€ใ“ใฎๅพŒใฎๆ›ธใ่พผใฟใงใ‚‚ๅ…ฑ็”จใ™ใ‚‹ใฎใงSerializeใ‚‚
ใคใ‘ใฆใŠใใพใ—ใŸใ€‚

ใƒ‡ใƒผใ‚ฟใ‚’ๆง‹้€ ไฝ“ใซใƒ‡ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใ™ใ‚‹ใ‚ณใƒผใƒ‰ใ€‚

src/bin/read_serde.rs

use std::{collections::HashMap, env::args};

use serde_csv_getting_started::Person;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut rdr = csv::ReaderBuilder::new()
        .has_headers(true)
        .delimiter(b',')
        .from_path(args().nth(1).unwrap())?;

    for result in rdr.deserialize() {
        let record: Person = result?;

        println!("deserialized record: {:?}", record);
        println!(
            "first name: {}, last_name: {}, age: {}",
            record.first_name, record.last_name, record.age
        );
    }

    let mut rdr = csv::ReaderBuilder::new()
        .has_headers(true)
        .delimiter(b',')
        .from_path(args().nth(1).unwrap())?;

    for result in rdr.deserialize() {
        let record: HashMap<String, String> = result?;

        println!("deserialized map record: {:?}", record);
        println!(
            "first name: {}, last_name: {}, age: {}",
            record.get("first_name").unwrap(),
            record.get("last_name").unwrap(),
            record.get("age").unwrap()
        );
    }

    Ok(())
}

ไปŠๅ›žใฏใƒ•ใ‚กใ‚คใƒซใ‚’ๅ…ฅๅŠ›ใซใ—ใพใ™ใ€‚ๅŒใ˜ใƒ•ใ‚กใ‚คใƒซใ‚’2ๅ›ž่ชญใ‚“ใงใ„ใฆใ€ไปŠๅ›žไฝœๆˆใ—ใŸๆง‹้€ ไฝ“ใจHashMapใซใใ‚Œใžใ‚Œใƒ‡ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บ
ใ—ใพใ™ใ€‚

ใ‚ใจReaderใ‚‚ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บใ™ใ‚‹ใ‚ณใƒผใƒ‰ใซใ—ใฆใŠใใพใ—ใŸใ€‚ใจใ„ใฃใฆใ‚‚ใ€ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆๅ€คใงใ™ใŒใ€‚

    let mut rdr = csv::ReaderBuilder::new()
        .has_headers(true)
        .delimiter(b',')
        .from_path(args().nth(1).unwrap())?;

ไปŠๅ›žใฎใƒใ‚คใƒณใƒˆใฏใ€Reader#deserializeใงใ™ใญใ€‚

    for result in rdr.deserialize() {
        let record: Person = result?;

ใ“ใ‚Œใงๆง‹้€ ไฝ“ใซใƒ‡ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚

็ขบ่ชใ€‚

$ cargo run --bin read_serde input/people.csv
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.06s
     Running `target/debug/read_serde input/people.csv`
deserialized record: Person { first_name: "ใ‚ซใƒ„ใ‚ช", last_name: "็ฃฏ้‡Ž", age: 11 }
first name: ใ‚ซใƒ„ใ‚ช, last_name: ็ฃฏ้‡Ž, age: 11
deserialized record: Person { first_name: "ใƒฏใ‚ซใƒก", last_name: "็ฃฏ้‡Ž", age: 9 }
first name: ใƒฏใ‚ซใƒก, last_name: ็ฃฏ้‡Ž, age: 9
deserialized record: Person { first_name: "ใ‚ฟใƒฉใ‚ช", last_name: "ใƒ•ใ‚ฐ็”ฐ", age: 3 }
first name: ใ‚ฟใƒฉใ‚ช, last_name: ใƒ•ใ‚ฐ็”ฐ, age: 3
deserialized map record: {"first_name": "ใ‚ซใƒ„ใ‚ช", "age": "11", "last_name": "็ฃฏ้‡Ž"}
first name: ใ‚ซใƒ„ใ‚ช, last_name: ็ฃฏ้‡Ž, age: 11
deserialized map record: {"last_name": "็ฃฏ้‡Ž", "first_name": "ใƒฏใ‚ซใƒก", "age": "9"}
first name: ใƒฏใ‚ซใƒก, last_name: ็ฃฏ้‡Ž, age: 9
deserialized map record: {"age": "3", "first_name": "ใ‚ฟใƒฉใ‚ช", "last_name": "ใƒ•ใ‚ฐ็”ฐ"}
first name: ใ‚ฟใƒฉใ‚ช, last_name: ใƒ•ใ‚ฐ็”ฐ, age: 3

็”จๆ„ใ—ใŸๆง‹้€ ไฝ“ใ€HashMapใใ‚Œใžใ‚Œใซใƒ‡ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใงใใฆใ„ใ‚‹ใ“ใจใŒ็ขบ่ชใงใใพใ—ใŸใ€‚

csvใ‚ฏใƒฌใƒผใƒˆใงCSVใ‚’ๆ›ธใ่พผใ‚€

ๆฌกใฏCSVใฎๆ›ธใ่พผใฟใงใ™ใ€‚

Module tutorial / Writing CSV

ใพใšใฏใ‚ทใƒณใƒ—ใƒซใชใƒ‘ใ‚ฟใƒผใƒณใ‹ใ‚‰ใ€‚ใƒ•ใ‚กใ‚คใƒซใƒ‘ใ‚นใฎๆŒ‡ๅฎšๆœ‰็„กใงใ€ใƒ•ใ‚กใ‚คใƒซใซๆ›ธใๅ‡บใ™ใ‹ๆจ™ๆบ–ๅ‡บๅŠ›ใซๆ›ธใๅ‡บใ™ใ‹ใฎๅ‹•ไฝœใŒๅค‰ใ‚ใ‚‹ใ‚ˆใ†ใซ
ใ—ใฆใ„ใพใ™ใ€‚

src/bin/write_simple.rs

use std::{
    env::args,
    fs::File,
    io::{self, Write},
};

use csv::{StringRecord, Writer};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut wtr: Writer<Box<dyn Write>> = if args().len() > 1 {
        csv::Writer::from_writer(Box::new(File::create(args().nth(1).unwrap())?))
    } else {
        csv::Writer::from_writer(Box::new(io::stdout()))
    };

    // header
    wtr.write_record(["field1", "field2", "field3"])?;

    // data
    wtr.write_record(["Java", "Rust", "Python"])?;
    wtr.write_record(&StringRecord::from(vec!["MySQL", "Elasticsearch", "Redis"]))?;

    wtr.flush()?;

    Ok(())
}

ใƒ˜ใƒƒใƒ€ใƒผใ‚‚ใƒฌใ‚ณใƒผใƒ‰ใจใ—ใฆๆ›ธใๅ‡บใ—ใพใ™ใ€‚

    // header
    wtr.write_record(["field1", "field2", "field3"])?;

ใƒ‡ใƒผใ‚ฟใฏ้…ๅˆ—ใ‚„Vecใจใ—ใฆไธŽใˆใฆใ‚‚ใ„ใ„ใงใ™ใ—ใ€StringRecordใจใ—ใฆไธŽใˆใฆใ‚‚OKใงใ™ใ€‚

    // data
    wtr.write_record(["Java", "Rust", "Python"])?;
    wtr.write_record(&StringRecord::from(vec!["MySQL", "Elasticsearch", "Redis"]))?;

flushใ™ใ‚‹ใ“ใจใ‚‚ๅฟ˜ใ‚Œใšใซใ€‚

    wtr.flush()?;

ใ“ใ“ใงใ€ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใงใฏๅฐ‘ใ—Writer#write_recordใฎใ‚ทใ‚ฐใƒ‹ใƒใƒฃใƒผใซใคใ„ใฆ่ชฌๆ˜ŽใŒใ‚ใ‚Šใพใ™ใ€‚

pub fn write_record<I, T>(&mut self, record: I) -> Result<()>
where
    I: IntoIterator<Item = T>,
    T: AsRef<[u8]>,

https://docs.rs/csv/1.4.0/csv/struct.Writer.html#method.write_record

ใ“ใ‚Œใฏๅผ•ๆ•ฐใฏIteratorใซๅค‰ๆ›ใงใใ€ไธญ่บซใฏ[u8]๏ผˆใƒใ‚คใƒˆใ‚นใƒฉใ‚คใ‚น๏ผ‰ใซๅค‰ๆ›ใงใใ‚‹ๅž‹ใงใ‚ใ‚‹ใ“ใจใ‚’่กจใ—ใฆใ„ใพใ™ใ€‚

็ขบ่ชใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

ๆจ™ๆบ–ๅ‡บๅŠ›ใซๆ›ธใๅ‡บใ™ๅ ดๅˆใ€‚

$ cargo run --bin write_simple
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.06s
     Running `target/debug/write_simple`
field1,field2,field3
Java,Rust,Python
MySQL,Elasticsearch,Redis

ใƒ•ใ‚กใ‚คใƒซใซๆ›ธใๅ‡บใ™ๅ ดๅˆใ€‚

$ cargo run --bin write_simple output/simple.csv
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/write_simple output/simple.csv`

output/simple.csv

field1,field2,field3
Java,Rust,Python
MySQL,Elasticsearch,Redis

OKใงใ™ใญใ€‚

ๆœ€ๅพŒใซSerdeใ‚’ไฝฟใฃใฆใฟใพใ™ใ€‚

src/bin/write_serde.rs

use std::env::args;

use serde_csv_getting_started::Person;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut wtr = csv::WriterBuilder::new()
        .has_headers(true)
        .delimiter(b',')
        .from_path(args().nth(1).unwrap())?;

    wtr.serialize(Person {
        first_name: "ใ‚ซใƒ„ใ‚ช".to_string(),
        last_name: "็ฃฏ้‡Ž".to_string(),
        age: 11,
    })?;

    wtr.serialize(Person {
        first_name: "ใƒฏใ‚ซใƒก".to_string(),
        last_name: "็ฃฏ้‡Ž".to_string(),
        age: 9,
    })?;

    wtr.serialize(Person {
        first_name: "ใ‚ฟใƒฉใ‚ช".to_string(),
        last_name: "ใƒ•ใ‚ฐ็”ฐ".to_string(),
        age: 3,
    })?;

    wtr.flush()?;

    Ok(())
}

Writerใฎไฝœๆˆใ‚‚ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บๅ‘ใ‘ใฎใ‚ณใƒผใƒ‰ใซใ—ใฆใฟใพใ—ใŸใ€‚

    let mut wtr = csv::WriterBuilder::new()
        .has_headers(true)
        .delimiter(b',')
        .from_path(args().nth(1).unwrap())?;

ๆง‹้€ ไฝ“ใ‚’ๆ›ธใ่พผใ‚€ๆ™‚ใฏใ€Write#serializeใ‚’ๅ‘ผใณๅ‡บใ—ใพใ™ใ€‚

    wtr.serialize(Person {
        first_name: "ใ‚ซใƒ„ใ‚ช".to_string(),
        last_name: "็ฃฏ้‡Ž".to_string(),
        age: 11,
    })?;

ๅค‰ใ‚ใ‚‹ใฎใฏใ“ใ“ใ ใ‘ใงใ™ใญใ€‚

็ขบ่ชใ€‚

$ cargo run --bin write_serde output/people.csv
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/write_serde output/people.csv`
output/people.csv
first_name,last_name,age
ใ‚ซใƒ„ใ‚ช,็ฃฏ้‡Ž,11
ใƒฏใ‚ซใƒก,็ฃฏ้‡Ž,9
ใ‚ฟใƒฉใ‚ช,ใƒ•ใ‚ฐ็”ฐ,3

OKใงใ™ใ€‚

ใ“ใ‚“ใชใจใ“ใ‚ใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใŠใ‚ใ‚Šใซ

RustใงCSVใ‚’ๆ‰ฑใฃใฆใฟใพใ—ใŸใ€‚

Serdeใ‚ฏใƒฌใƒผใƒˆใ‚‚ๅˆใ‚ใ›ใฆไฝฟใฃใฆใฟใพใ—ใŸใŒใ€ใกใ‚‡ใฃใจ็‹ฌ็‰นใชใจใ“ใ‚ใŒใ‚ใ‚Šใพใ™ใญใ€‚ๆ…ฃใ‚ŒใŸใ‚‰ไฝฟใฃใฆใ„ใ‘ใ‚‹ใจใฏๆ€ใ„ใพใ™ใŒใ€‚

ใฒใจใพใšใ€ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใƒปใƒ‡ใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บใซใฏSerdeใจ่ฆšใˆใฆใŠใใพใ—ใ‚‡ใ†ใ€‚