---
name: diy-pc-ingest
description: "Ingest pasted PC parts purchase/config text (Discord message receipts, bullet lists) into Notion DIY_PC tables (PCConfig, ストレージ, エンクロージャー, PCInput). Use when the user pastes raw purchase logs/spec notes and wants the AI to classify, enrich via web search, ask follow-up questions for unknowns, and then upsert rows into the correct Notion data sources using the 2025-09-03 data_sources API."
---

# diy-pc-ingest

## Setup (required)

This skill is intended to be shared. Do **not** hardcode your Notion IDs or token in the skill.

1) Copy the example config:
- `skills/diy-pc-ingest/references/config.example.json` → `~/.config/diy-pc-ingest/config.json`

2) Fill in your Notion targets (IDs):
- `notion.targets.*.data_source_id` (for schema/query)
- `notion.targets.*.database_id` (for creating pages)

3) Provide a Notion integration token (choose one):
- env: `NOTION_API_KEY` (recommended)
- or `~/.config/notion/api_key` (legacy local path)
- or inline `notion.api_key` in `config.json` (not recommended if you publish/share configs)

Notes:
- This skill uses Notion-Version `2025-09-03` by default.
- Targets are read at runtime from config; see `references/config.example.json`.

## Canonical Notion targets

Use **data_sources** endpoints for schema/query, and **pages** endpoint for row creation.

(IDs are intentionally not included in this public skill. They live in your local config.)

## Workflow (A: user pastes raw text)

1) **Read the pasted text** and decide target table per item:
   - **エンクロージャー**: USB/RAID/HDDケース/ドック、ベイ数、JAN/型番、"安全な取り外し"表示名。
   - **ストレージ**: HDD/SSD/NVMe/SATA/容量/シリアル/健康状態。
   - **PCConfig**: CPU/GPU/RAM/PSU/MB/ケース/冷却/NIC/キャプチャ等。

2) **Extract fields** (best-effort). Prefer Japanese column names as they exist in each table.

3) **Enrich specs using web_search/web_fetch** when it reduces user work (e.g., bay count, interface, capacity, form factor). Keep it minimal; don’t overfill.

4) **Ask follow-up questions** only for fields needed to avoid ambiguity or bad joins.
   - **ストレージ**: Serial missing → ask for serial (or confirm creating as “暫定/シリアル不明”).
   - **エンクロージャー**: ベイ数 or USB/Thunderbolt/LAN unclear → ask.
   - **PCConfig**: Identifier/型番 missing but needed to match existing row → ask.

5) **Upsert into Notion** using `scripts/notion_apply_records.js`:
   - Provide JSONL records (one per item) on stdin.
   - Script will:
     - find an existing row by key (see below)
     - patch only missing fields unless `overwrite=true`
     - otherwise create a new row

6) Report results (created/updated/skipped) and link any created rows.

## Upsert keys (rules)

- **ストレージ**: `シリアル` (exact) is the primary key. If the existing row was created without serial, allow a safe fallback match by title + (optional) `購入日`/`価格(円)` to support post-fill of serial/health/scan-date.
- **エンクロージャー**: `取り外し表示名` (exact) else title/name.
- **PCConfig**: `(Name + Purchase Date)` を複合キーとして扱う（exact）。重複ヒット時は書き込まず質問。
- If a key collides with multiple rows, do not write; ask user.

## JSONL input format for the apply script

Each line is a JSON object:

```json
{"target":"enclosure","title":"RATOC RS-EC32-R5G","properties":{"種別":"USBケース","接続":"USB","ベイ数":2,"普段つないでるPC":"RECRYZEN","購入日":"2026-01-18","購入店":"PCワンズ","価格(円)":8977,"取り外し表示名":"RS-EC32-R5G","メモ":"JAN: 4949090752191"}}
```

Optional control fields (for cleanup / manual fixes):
- `page_id` (or `id`): update this Notion page directly (bypasses upsert matching)
- `archive: true`: archive the page (useful for de-dup)
- `overwrite: true`: allow overwriting existing values (including clearing with null)

Optional behavior flags:
- `mirror_to_pcconfig: true` (only for `target=storage`): also create/update a `pcconfig` row for the installed component.
  - requires: `現在の接続先PC`, `購入日`, `Name`

Targets: `enclosure | storage | pcconfig | pcinput`

Property value encoding:
- select/status: string name
- rich_text: string
- number: number
- date: `YYYY-MM-DD`
- checkbox: boolean
- relation: array of page_ids (advanced; avoid unless needed)

## Notes

- Always use Notion-Version `2025-09-03`.
- Prefer `POST /v1/data_sources/{id}/query` over `/databases/{id}/query`.
- Relation schema updates require `relation.data_source_id` (not database_id).


## Note (implementation)
- JS implementation is the default: `scripts/notion_apply_records.js`
- Legacy Python implementation is kept for reference: `scripts/_deprecated/notion_apply_records.py`
