feat(our-gdrive-organizer): add new skill at slot 82, rename old 82 → 92
New Python CLI + dual SKILL.md (Code + Desktop) for organizing Google Drive folders under OurDigital conventions: - Refresh root README index (preserves manual Topics/Notes between AUTO-STRUCTURE markers) - Ensure per-subfolder README.md meta files - Propose filename + folder renames (D.intelligence → OurDigital with SEO-context caveat documented in patterns/gotchas.md) - Propose moves for cluttered files (screenshots, temp downloads) - Sensitive-folder skip list (04_Case Studies, 99_Project Archive, *Archive*, 진단*) - shared/patterns/ gotcha library: canonical-files, canonical-folders, categorization-rules, 12 known gotchas — grows over time as the system encounters new edge cases Slash command: /organize. CLI: ~/.local/bin/our-gdrive-organize. 82-tui-design-template renumbered to 92 (no content change) to free slot 82. AGENTS.md and CLAUDE.md updated for both moves. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
153
custom-skills/82-our-gdrive-organizer/shared/conventions.md
Normal file
153
custom-skills/82-our-gdrive-organizer/shared/conventions.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# OurDigital Drive Folder Conventions
|
||||
|
||||
Canonical reference for naming and organization patterns enforced by
|
||||
`our-gdrive-organizer`. The script's rules live in `code/organizer.py` —
|
||||
keep this document and that code in sync.
|
||||
|
||||
For the **gotcha library** (canonical examples + edge cases consulted
|
||||
during interactive content-based reorganization), see `patterns/`:
|
||||
- `patterns/canonical-files.md`
|
||||
- `patterns/canonical-folders.md`
|
||||
- `patterns/categorization-rules.md`
|
||||
- `patterns/gotchas.md`
|
||||
|
||||
The brand prefix rules (`D.intelligence …` → `OurDigital …`) now apply to
|
||||
folder names too, at depth 2+. Top-level folders (e.g., `00_Brand Management/`)
|
||||
are never auto-renamed.
|
||||
|
||||
## Folder naming
|
||||
|
||||
### 2nd-level Drive folders (top-level practice areas)
|
||||
|
||||
`NN_descriptive name`, where NN is a 2-digit numeric prefix indicating the
|
||||
"sort bucket":
|
||||
|
||||
| Range | Meaning |
|
||||
|-------|---------|
|
||||
| 00–09 | Brand / core / cross-cutting |
|
||||
| 10–19 | Product or specialty practice |
|
||||
| 20–29 | Data / integrations |
|
||||
| 90–99 | Archive |
|
||||
|
||||
Examples observed: `00_OurDigital`, `01_Brand in Action`, `02_SEO in Action`,
|
||||
`10_OurSEO Agent`, `20_DataForSEO`, `99_Project Archive`.
|
||||
|
||||
### 3rd-level subfolders
|
||||
|
||||
`NN_descriptive name` again, scoped to the parent. Maturity ordering:
|
||||
|
||||
| Range | Meaning |
|
||||
|-------|---------|
|
||||
| 00–05 | Frameworks / always-on assets |
|
||||
| 10–13 | Productized tooling / specialty modules |
|
||||
| 20 | Data |
|
||||
| 90+ | Archive within this practice |
|
||||
|
||||
### Client / project subfolders
|
||||
|
||||
Inside `01_Active Workspaces/` or `99_Project Archive/`:
|
||||
|
||||
`NN_{client name}` — e.g., `00_Jamie Clinic`, `04_오현이혼상속센터`,
|
||||
`05_1가다`. NN is assigned in chronological / engagement order.
|
||||
|
||||
### Reserved / system subfolders
|
||||
|
||||
- `screenshots/` — auto-created by the organizer when moving stray screenshot
|
||||
files out of a parent folder root.
|
||||
- `_unsorted/` — auto-created by the organizer for incomplete downloads
|
||||
(`.crdownload`, `.tmp`, `.partial`).
|
||||
|
||||
## File naming
|
||||
|
||||
### Templates and quotes (in `05_Working Template/`)
|
||||
|
||||
`OurDigital-{Service}-OOO {date}.{ext}` or
|
||||
`OurDigital-{Service}-OOOOOO {modifier}.{ext}`.
|
||||
|
||||
`OOO` and `OOOOOO` are the canonical placeholder strings for "client name
|
||||
goes here" — chosen to be visually obvious and easy to grep for. Use
|
||||
whichever makes more visual sense in the filename.
|
||||
|
||||
Examples:
|
||||
- `OurDigital-SEO Coaching-OOO 견적-20240612.gsheet`
|
||||
- `OurDigital-SEO Treatment-OOO 호텔 견적-20240903.gsheet`
|
||||
- `OurDigital-OOO 호텔 SEO Basic 패키지-20250416.gsheet`
|
||||
- `OurDigital-Data Access & Management Agreement - 2026.gsheet`
|
||||
|
||||
### Brand prefix — parent company / SEO child brand
|
||||
|
||||
D.intelligence is the **parent company**; OurDigital is its **SEO-specialty
|
||||
child brand**. The rebrand-to-OurDigital rule only applies when the asset
|
||||
is SEO-related.
|
||||
|
||||
Rules (filesystem rename only — does not touch cell/body content):
|
||||
|
||||
- `D.intelligence Lab-` → `OurDigital-`
|
||||
- `D.intelligence` (anywhere) → `OurDigital`
|
||||
- `D intelligence` (no-dot variant) → `OurDigital`
|
||||
|
||||
The organizer applies these to both files and folders at depth 2+. Top-level
|
||||
folders (`NN_…`) are never auto-renamed.
|
||||
|
||||
**Important**: The script doesn't enforce the SEO-context caveat. When you
|
||||
point the organizer at the whole Drive Stream or a non-SEO folder, it will
|
||||
rename ALL D.intelligence references — which is wrong outside SEO context.
|
||||
Only run the organizer on SEO folders (`02_SEO in Action/`,
|
||||
`00_OurDigital/04_SEO/`, etc.). For non-SEO D.intelligence assets, do not
|
||||
rename — they belong to the parent company.
|
||||
|
||||
See `patterns/gotchas.md` "D.intelligence vs OurDigital" for full guidance.
|
||||
|
||||
### Archive client files
|
||||
|
||||
Files inside `99_Project Archive/{client}/` should KEEP their original
|
||||
filenames including real client names. The script skips these folders for
|
||||
rename/move operations.
|
||||
|
||||
### Date stamps
|
||||
|
||||
Use `YYYYMMDD` (no separator) when embedding a date in a filename:
|
||||
`OurDigital-Data Access & Management Agreement - 2026.gsheet`
|
||||
`OurDigital-SEO Coaching-OOO 견적-20240612.gsheet`
|
||||
|
||||
When a date range is needed: `YYYYMMDD-YYYYMMDD`.
|
||||
|
||||
### Extensions and stub files
|
||||
|
||||
Google Drive Apps formats appear as 180-byte JSON stubs on the local
|
||||
filesystem with these extensions:
|
||||
|
||||
| Drive type | Extension |
|
||||
|-----------|-----------|
|
||||
| Docs | `.gdoc` |
|
||||
| Sheets | `.gsheet` |
|
||||
| Slides | `.gslides`|
|
||||
| Forms | `.gform` |
|
||||
|
||||
Renaming the stub on the filesystem only changes the local filename — the
|
||||
backing Google document, its Doc ID, sharing links, and revision history are
|
||||
untouched. Safe to rename. Cell-level / body-level changes still require
|
||||
opening the file in the corresponding Google app.
|
||||
|
||||
## What the organizer does NOT enforce
|
||||
|
||||
- Cell content inside `.gsheet`, body content inside `.gdoc`, slide content
|
||||
inside `.gslides`, or any binary file (`.pdf`, `.pptx`, `.xlsx`). Those need
|
||||
manual editing in the source app. Track them with a `TODO.md` if needed
|
||||
(see `02_SEO in Action/98_Training/TODO.md` for an example pattern).
|
||||
- Folder maturity ordering — the NN prefix system is a convention, but the
|
||||
script doesn't reorder or renumber folders.
|
||||
- Per-folder `README.md` content beyond the AUTO-STRUCTURE block — manual
|
||||
Topics / Notes sections are preserved.
|
||||
|
||||
## Sensitive folders (never auto-modified)
|
||||
|
||||
Internal regex list (`SENSITIVE_SUBFOLDER_PATTERNS` in `organizer.py`):
|
||||
|
||||
- `^04_Case Studies$`
|
||||
- `^99_Project Archive$`
|
||||
- `.*Archive$` (case-insensitive)
|
||||
- `^진단.*$`
|
||||
|
||||
These folders are still indexed (counts appear in the README structure),
|
||||
but no files inside them are renamed or moved.
|
||||
@@ -0,0 +1,31 @@
|
||||
# Patterns library — gotcha folder
|
||||
|
||||
The "gotcha folder" Claude consults when doing **content-based reorganization**.
|
||||
Filename pattern matching is handled deterministically by `code/organizer.py`;
|
||||
this folder is for the judgment-calls Claude makes when reading file contents
|
||||
to decide where something belongs.
|
||||
|
||||
## Files
|
||||
|
||||
- `canonical-files.md` — examples of well-named files in their proper homes.
|
||||
When Claude sees a file and isn't sure where it goes, it pattern-matches
|
||||
against these canonical examples.
|
||||
- `canonical-folders.md` — well-organized folder shapes. What goes in
|
||||
`02_SEO Audit Toolkit/` vs `03_SEO Hack Library/` vs `99_Project Archive/`.
|
||||
- `categorization-rules.md` — explicit IF→THEN rules for placement decisions.
|
||||
These trump heuristics; if a rule applies, follow it.
|
||||
- `gotchas.md` — edge cases, ambiguous files, common mistakes, and how to
|
||||
resolve them.
|
||||
|
||||
## How to extend
|
||||
|
||||
When the user encounters a new edge case or pattern that the script can't
|
||||
handle automatically, add it here:
|
||||
1. If the rule is deterministic (filename pattern → action), put it in
|
||||
`code/organizer.py` (`RENAME_RULES`, `MOVE_RULES`) and document in
|
||||
`shared/conventions.md`.
|
||||
2. If the rule is judgment-based (read content, decide), add a new entry
|
||||
here and reference it from `code/SKILL.md`'s content-based workflow.
|
||||
|
||||
The patterns library should grow over time as Claude + user encounter more
|
||||
edge cases. Each addition is a "gotcha" the system has learned.
|
||||
@@ -0,0 +1,92 @@
|
||||
# Canonical file examples
|
||||
|
||||
Reference set of well-named files in their correct homes. When Claude sees
|
||||
an unfamiliar file, it should pattern-match against these and ask: "what
|
||||
home best fits this file's shape?"
|
||||
|
||||
## Templates / blank artifacts → `05_Working Template/`
|
||||
|
||||
Filenames are generic and use placeholder client names (`OOO`, `OOOOOO`):
|
||||
|
||||
- `OurDigital-SEO Audit Template-20240922.gsheet`
|
||||
- `OurDigital-Local SEO Audit 견적서.xlsx`
|
||||
- `OurDigital-OOO 호텔 SEO Basic 패키지-20250416.gsheet`
|
||||
- `OurDigital-OOOOOO SEO Audit & Treatment_20250120.gsheet`
|
||||
- `OurDigital-SEO Coaching-OOO 견적-20240612.gsheet`
|
||||
- `OurDigital-on-Page SEO-T&D Generator.gsheet`
|
||||
- `OurDigital-SEO job tracker-2025.gsheet`
|
||||
- `OurDigital-Data Access & Management Agreement - 2026.gsheet`
|
||||
|
||||
Pattern: `OurDigital-{topic}-{OOO/OOOOOO placeholder}-{YYYYMMDD}.{ext}`
|
||||
|
||||
## Audit toolkit reusable assets → `02_SEO Audit Toolkit/`
|
||||
|
||||
Reusable proposal templates, on-page elements kits, framework documents:
|
||||
|
||||
- `D.intelligence Lab-SEO Audit & Treatment 2025-Proposal-Template.pdf`
|
||||
(legacy — should be renamed to `OurDigital-…`)
|
||||
- `OurDigital-on-Pages Elements Kit-20250529.gsheet`
|
||||
- `SEO Audit & Check_NotebookLM.wav`
|
||||
|
||||
Subfolders typical here: `참고 자료/`, `예시 자료 모음/`, `문서 양식/`,
|
||||
`교육 자료/`, `Google Business Profile/`, `robots.txt/`, `sitemap.xml/`.
|
||||
|
||||
## Reference library / external research → `03_SEO Hack Library/`
|
||||
|
||||
Third-party PDFs, webinar materials, structured-data references, academic
|
||||
papers, framework PPTs:
|
||||
|
||||
- `1-1-what-is-structured-data-structured-data-for-beginners.pdf`
|
||||
- `2-1-the-yoast-seo-graph-structured-data-for-beginners.pdf`
|
||||
- `SEO_Advanced_구조화 된 데이터 스키마의 이해.pptx`
|
||||
- `OurDigital-SEO-curl-commands.pdf`
|
||||
- `opensurvey_trend_search_2024.pdf`
|
||||
|
||||
Pattern: external-source-derived names (paper IDs, course module numbering,
|
||||
vendor names) — not OurDigital-prefixed.
|
||||
|
||||
## Active engagement working files → `01_Active Workspaces/{NN_client}/`
|
||||
|
||||
Real client name in path; files reference the engagement directly:
|
||||
|
||||
- `01_Active Workspaces/00_Jamie Clinic/JAM-FAQ 엔트리 추출-정리-20260304.gsheet`
|
||||
- `01_Active Workspaces/01_신라호텔 SEO/SLA - SEO KPIs and goal setup_20251020.gsheet`
|
||||
- `01_Active Workspaces/01_신라호텔 SEO/Shilla_SEO_Performance_Scorecard.xlsx`
|
||||
- `01_Active Workspaces/02_K Beauty CC 우승기업/[Note] K-Beauty CC 우승 기업 컨설팅_20260210.gdoc`
|
||||
|
||||
Pattern: `{ClientPrefix}-{topic}-{date}.{ext}` or `[Note] {description}.gdoc`.
|
||||
Client name appears in BOTH the folder name AND the filename — that's expected.
|
||||
|
||||
## Past engagement deliverables → `04_Case Studies/`
|
||||
|
||||
Polished proposal/audit PDFs from completed work, used as portfolio reference.
|
||||
Real client names retained:
|
||||
|
||||
- `신라호텔 SEO 제안서 개요.pdf`
|
||||
- `소노 인터내셔널 Preliminary SEO Audit.pdf`
|
||||
- `JHR-조선호텔 웹사이트 리뉴얼 SEO 전략 검토-20260303.gdoc`
|
||||
- `그랜드 머큐어 임페리얼 팰리스 호텔 SEO 진단 컨설팅 계약서.pdf`
|
||||
|
||||
Pattern: client name first, deliverable type, optional date. Always real
|
||||
names (this folder is the case-study portfolio).
|
||||
|
||||
## Archived completed projects → `99_Project Archive/{NN_client}/`
|
||||
|
||||
Full engagement archive — all working files preserved with original names:
|
||||
|
||||
- `99_Project Archive/01_그랜드 머큐어 임페리얼 SEO Basic/00_성과 측정 기준/...`
|
||||
- `99_Project Archive/02_TNS 유학원 SEO 진단/Crawling data/...`
|
||||
- `99_Project Archive/04_오현이혼상속센터/D.intelligence Lab-SEO Coaching-양제민 변호사-20240806.gsheet`
|
||||
|
||||
Pattern: client name in folder, original delivery filenames preserved
|
||||
(do NOT normalize — these are historical records).
|
||||
|
||||
## Training materials → `98_Training/`
|
||||
|
||||
Generic, anonymized lesson content. Client-specific lesson notes belong
|
||||
in the archive, NOT here:
|
||||
|
||||
- `98_Training/01_수업 계획_코스/Content Marketing Workout.md`
|
||||
- `98_Training/01_수업 계획_코스/SEO 입문 기본교육 과정.gdoc`
|
||||
- `98_Training/04_강의자료 스크린샷/Screenshot 2024-09-22 at *.png`
|
||||
- `98_Training/09_외부 강의/Shopee e-Commerce SEO/Global e-Commerce SEO in Action 101.pdf`
|
||||
@@ -0,0 +1,96 @@
|
||||
# Canonical folder shapes
|
||||
|
||||
What "well-organized" looks like at each level. Use these as anchors when
|
||||
deciding whether to create a new subfolder or which existing one a file
|
||||
should live in.
|
||||
|
||||
## Top-level practice area (e.g., `02_SEO in Action/`)
|
||||
|
||||
```
|
||||
NN_Practice Area/
|
||||
├── README.md # auto-indexed root
|
||||
├── 00_Brand Management/ # 00–05: frameworks / always-on
|
||||
├── 01_Active Workspaces/ # current client engagements
|
||||
├── 02_{Practice} Audit Toolkit/ # reusable audit assets
|
||||
├── 03_{Practice} Hack Library/ # external reference / research
|
||||
├── 04_Case Studies/ # past engagement portfolio
|
||||
├── 05_Working Template/ # blank quote/audit/coaching templates
|
||||
├── 10_{Productized Tool}/ # 10–13: productized specialty
|
||||
├── 11_{Specialty Module}/
|
||||
├── 20_{Data Source}/ # 20s: data integrations
|
||||
├── 98_Training/ # 98: training materials
|
||||
└── 99_Project Archive/ # 99: completed engagements
|
||||
```
|
||||
|
||||
Maturity convention by NN range:
|
||||
- 00–05: foundational / framework / always-on
|
||||
- 10–13: productized tools / specialties
|
||||
- 20–29: data integrations
|
||||
- 90–99: archive / training / closed work
|
||||
|
||||
## Active workspace shape (`01_Active Workspaces/`)
|
||||
|
||||
```
|
||||
01_Active Workspaces/
|
||||
├── README.md
|
||||
├── 00_{Client A}/
|
||||
│ ├── {client-prefix}-{deliverable}-{date}.{ext}
|
||||
│ ├── [Note] {topic} {date}.gdoc
|
||||
│ └── AI Reference/ # if engagement uses AI tools
|
||||
└── 01_{Client B}/
|
||||
└── ...
|
||||
```
|
||||
|
||||
Each client gets one subfolder, NN-prefixed in chronological onboarding
|
||||
order. Files use a short client prefix (e.g., `JAM-` for Jamie, `SLA-` for
|
||||
신라호텔, `JHR-` for 조선호텔).
|
||||
|
||||
## Case study shape (`04_Case Studies/`)
|
||||
|
||||
Flat — files at the root, no subfolders:
|
||||
|
||||
```
|
||||
04_Case Studies/
|
||||
├── README.md
|
||||
├── {ClientName} SEO {DeliverableType}.pdf
|
||||
├── {ClientName} {DeliverableType} {date}.gdoc
|
||||
└── ...
|
||||
```
|
||||
|
||||
Each file is a portfolio-quality deliverable. No working files here.
|
||||
|
||||
## Project archive shape (`99_Project Archive/`)
|
||||
|
||||
```
|
||||
99_Project Archive/
|
||||
├── README.md
|
||||
├── 01_{First archived client}/
|
||||
│ ├── 00_{topic}/ # may have its own NN-prefixed subfolders
|
||||
│ ├── 09_사전 진단 / # diagnostic phase
|
||||
│ ├── 10_계약 관련/ # contract phase
|
||||
│ ├── 90_고객사 수급자료/ # client-supplied materials
|
||||
│ └── {original-filename}.{ext} # plus loose root files
|
||||
└── 02_{Second archived client}/
|
||||
└── ...
|
||||
```
|
||||
|
||||
Sub-folder structure inside each archived client mirrors the original
|
||||
engagement folder layout — nothing renamed or normalized.
|
||||
|
||||
## Audit toolkit shape (`02_SEO Audit Toolkit/`)
|
||||
|
||||
```
|
||||
02_{Practice} Audit Toolkit/
|
||||
├── README.md
|
||||
├── 참고 자료/ # references
|
||||
├── 예시 자료 모음/ # neutralized example deliverables
|
||||
├── 문서 양식/ # blank document forms
|
||||
├── 교육 자료/ # internal training assets
|
||||
├── {tool}_standard check_{date}/ # versioned tool snapshots
|
||||
├── Google Business Profile/ # specialty subdomain
|
||||
├── robots.txt/ # specialty subdomain
|
||||
└── sitemap.xml/ # specialty subdomain
|
||||
```
|
||||
|
||||
Subfolders here are **topic-grouped reusable assets**. Each subfolder is
|
||||
purpose-named (Korean OK) — not NN-prefixed because order doesn't matter.
|
||||
@@ -0,0 +1,62 @@
|
||||
# Categorization rules
|
||||
|
||||
IF→THEN rules for deciding where a file belongs. Apply in order; first
|
||||
match wins.
|
||||
|
||||
## Hard-coded rules (always honor)
|
||||
|
||||
| If file… | Then it belongs in… |
|
||||
|---|---|
|
||||
| Lives inside `04_Case Studies/` or `99_Project Archive/` | leave it (sensitive — never auto-move) |
|
||||
| Filename starts with `Screenshot YYYY-MM-DD at` | parent folder's `screenshots/` subdir |
|
||||
| Has extension `.crdownload`, `.tmp`, `.partial` | `_unsorted/` (temp / interrupted) |
|
||||
| Has `D.intelligence` in name | rename to `OurDigital` (filesystem rename only) |
|
||||
|
||||
## Content + filename heuristics (judgment calls)
|
||||
|
||||
### Templates vs Case Studies
|
||||
|
||||
| Signal | Verdict |
|
||||
|---|---|
|
||||
| Contains placeholder strings `OOO` / `OOOOOO` in filename | Template — `05_Working Template/` |
|
||||
| Filename is `OurDigital-{topic}-{specific-client}-{date}` AND client is real | Case Study or Active Workspace, NOT template |
|
||||
| Real client name in filename + signed contract content | `04_Case Studies/` |
|
||||
| Real client name + WIP / current-quarter date | `01_Active Workspaces/{NN_client}/` |
|
||||
| Real client name + closure-marker content (final report, sign-off) | `99_Project Archive/{NN_client}/` |
|
||||
|
||||
### Reference library vs Audit toolkit
|
||||
|
||||
| Signal | Verdict |
|
||||
|---|---|
|
||||
| Source is external (academic paper, vendor whitepaper, foreign URL slug, paper ID `2286-Article…`) | `03_{Practice} Hack Library/` |
|
||||
| Source is OurDigital-authored, intended as reusable proposal/audit asset | `02_{Practice} Audit Toolkit/` |
|
||||
| Korean filename about a niche specialty (sitemap.xml, robots.txt) | `02_…/{specialty}/` subdirectory |
|
||||
|
||||
### Training material vs Engagement notes
|
||||
|
||||
| Signal | Verdict |
|
||||
|---|---|
|
||||
| Generic title, no client name (`SEO 입문 기본교육 과정.pdf`) | `98_Training/01_수업 계획_코스/` |
|
||||
| Lesson notes referencing real lawyer/doctor/consultant by name | `99_Project Archive/{NN_client}/` (it's a record of the engagement) |
|
||||
| Screenshot from a lesson | `98_Training/04_강의자료 스크린샷/` if generic; archive if it shows specific client data |
|
||||
| External lecture deck (Shopee, Google event) | `98_Training/09_외부 강의/{Topic}/` |
|
||||
|
||||
### Quote / proposal / contract documents
|
||||
|
||||
| Signal | Verdict |
|
||||
|---|---|
|
||||
| Quote sheet for a specific client, engagement won → archived | `99_Project Archive/{NN_client}/` |
|
||||
| Quote sheet for a specific client, engagement won → ongoing | `01_Active Workspaces/{NN_client}/` |
|
||||
| Quote sheet that's been neutralized (client → OOO) | `05_Working Template/` |
|
||||
| Signed contract PDF | usually `04_Case Studies/` (portfolio) or archive |
|
||||
|
||||
## Anti-rules (do NOT do these)
|
||||
|
||||
- **Do not rename files inside `04_Case Studies/` or `99_Project Archive/`**
|
||||
even if they have `D.intelligence` in the name. Those are historical records
|
||||
and the brand at the time was D.intelligence — preserving that is correct.
|
||||
- **Do not change Korean folder names to English** (or vice versa). Language
|
||||
is intentional.
|
||||
- **Do not collapse client subfolders** even if they only have 1–2 files.
|
||||
- **Do not move things to satisfy "everything balanced"** — empty subfolders
|
||||
are fine if they represent reserved slots.
|
||||
275
custom-skills/82-our-gdrive-organizer/shared/patterns/gotchas.md
Normal file
275
custom-skills/82-our-gdrive-organizer/shared/patterns/gotchas.md
Normal file
@@ -0,0 +1,275 @@
|
||||
# Gotchas
|
||||
|
||||
Edge cases the system has learned. When in doubt during interactive
|
||||
content-based reorganization, check here first.
|
||||
|
||||
Each gotcha follows the format: **Pattern → Why it's tricky → Resolution**.
|
||||
|
||||
---
|
||||
|
||||
### Lesson notes for a specific lawyer/doctor/consultant
|
||||
|
||||
**Pattern**: `Notes – [레슨] SEO 진단 & 관리 수업 - 양제민 변호사 6회차 (대면).gdoc`
|
||||
or similar lesson-format file referencing a real client by name.
|
||||
|
||||
**Why tricky**: Looks like training material (it IS a lesson note), but it's
|
||||
client-specific (양제민 variant of 오현이혼상속센터 engagement).
|
||||
|
||||
**Resolution**: Belongs in `99_Project Archive/{NN_그_클라이언트}/`, NOT in
|
||||
`98_Training/`. Training is for generic, reusable content. Client-specific
|
||||
lesson notes are engagement records.
|
||||
|
||||
---
|
||||
|
||||
### Quote sheet with `D.intelligence Lab-` prefix and a client name
|
||||
|
||||
**Pattern**: `D.intelligence Lab-SEO Coaching-오현법률사무소-20240612.gsheet`
|
||||
|
||||
**Why tricky**: Has both a brand-rebrand candidate (`D.intelligence Lab-` →
|
||||
`OurDigital-`) AND a real client name that should become `OOO`. But cell
|
||||
content can't be normalized by filesystem rename.
|
||||
|
||||
**Resolution**:
|
||||
1. Filesystem rename: `OurDigital-SEO Coaching-OOO 견적-20240612.gsheet`
|
||||
2. Add to a `TODO.md` reminding the user to open the sheet in Google Sheets
|
||||
and replace `오현법률사무소` and contact info inside cells with `OOO` /
|
||||
placeholder text.
|
||||
3. Move to `05_Working Template/` once both filesystem AND cell content are
|
||||
neutralized. Until then, leaving the file in place with the rename done
|
||||
is a valid intermediate state.
|
||||
|
||||
---
|
||||
|
||||
### Files at the root that look like they should be in a subfolder
|
||||
|
||||
**Pattern**: A top-level subfolder root contains 30+ loose files plus 0
|
||||
subfolders. E.g., a `screenshots` collection directly at the top of
|
||||
`98_Training/`.
|
||||
|
||||
**Why tricky**: The script's `MOVE_RULES` only catches very specific
|
||||
patterns (`Screenshot YYYY-MM-DD…`). Manual moves often need judgment —
|
||||
which subfolder should be created, what should be its name?
|
||||
|
||||
**Resolution**: Interactive content-based mode. Claude reads filenames in
|
||||
batches, proposes a subfolder name (matching local language convention —
|
||||
Korean if rest of folder is Korean), confirms with user, then moves with
|
||||
`mv`. Update the parent README afterward via `our-gdrive-organize --scope index`.
|
||||
|
||||
---
|
||||
|
||||
### Korean vs English filename mixing inside one subfolder
|
||||
|
||||
**Pattern**: `02_SEO Audit Toolkit/` contains both English files
|
||||
(`OurDigital-on-Pages Elements Kit-20250529.gsheet`) and Korean subfolders
|
||||
(`참고 자료/`, `문서 양식/`).
|
||||
|
||||
**Why tricky**: Looks inconsistent at first glance, but is intentional —
|
||||
files use English when they're "OurDigital products" and Korean when
|
||||
they're "Korean-language reference materials."
|
||||
|
||||
**Resolution**: Don't normalize. Language tracks function:
|
||||
- OurDigital-authored asset → English filename, OurDigital prefix
|
||||
- External / Korean reference → Korean filename
|
||||
- Subfolder for grouping Korean references → Korean folder name
|
||||
|
||||
---
|
||||
|
||||
### Empty subfolders
|
||||
|
||||
**Pattern**: `99_Project Archive/03_소노펠리체CC Local SEO/09_수급 정보/`
|
||||
contains 0 files.
|
||||
|
||||
**Why tricky**: Tempting to delete to "clean up." But empty subfolders often
|
||||
represent reserved engagement phases that the project just didn't reach,
|
||||
or pending document deliveries.
|
||||
|
||||
**Resolution**: Leave empty subfolders alone unless the user explicitly
|
||||
says to clean them up. They don't break anything.
|
||||
|
||||
---
|
||||
|
||||
### Numbered duplicates: `(1)`, `(2)` suffixes
|
||||
|
||||
**Pattern**: `D.intelligence Lab-SEO Coaching-오현법률사무소-20240612 (1).gsheet`
|
||||
exists alongside the same name without the `(1)`.
|
||||
|
||||
**Why tricky**: Looks like a Drive sync duplicate, but `cmp` shows different
|
||||
bytes — they're DIFFERENT Drive documents that happen to have the same name.
|
||||
|
||||
**Resolution**: `cmp` the two `.gsheet` stubs. If different (which they
|
||||
usually are for `(N)`-suffixed files), preserve both with a suffix like
|
||||
`(v1)`, `(v2)`, or `(legacy)`. Never overwrite blindly. If actually
|
||||
identical bytes, ask user which to keep.
|
||||
|
||||
---
|
||||
|
||||
### `_unsorted/` accumulates over time
|
||||
|
||||
**Pattern**: After several `--scope move --apply` runs, `_unsorted/`
|
||||
accumulates `.crdownload` / `.tmp` files that the user never went back to.
|
||||
|
||||
**Why tricky**: These are usually legitimate trash but occasionally a real
|
||||
in-progress download.
|
||||
|
||||
**Resolution**: Don't auto-delete. Periodically prompt the user: "Your
|
||||
`_unsorted/` has N files older than 30 days. Want to review?"
|
||||
|
||||
---
|
||||
|
||||
### A folder that mixes archive + active work
|
||||
|
||||
**Pattern**: A subfolder under `01_Active Workspaces/` contains both
|
||||
ongoing work AND files from a finished engagement that should have been
|
||||
archived.
|
||||
|
||||
**Why tricky**: Hard to tell from filenames alone. Need to check mtimes
|
||||
and content (last-modified-recently → active; older + closure-marker docs →
|
||||
should be archived).
|
||||
|
||||
**Resolution**: Interactive mode. Claude reads file mtimes + samples
|
||||
content, proposes splitting into a new `99_Project Archive/{NN_client}/`
|
||||
entry. User confirms before moving.
|
||||
|
||||
---
|
||||
|
||||
### D.intelligence vs OurDigital — parent company / child brand
|
||||
|
||||
**Pattern**: Files or folders named `D.intelligence …`, `D intelligence …`,
|
||||
or with the legacy `D.intelligence Lab-` prefix.
|
||||
|
||||
**Why tricky**: D.intelligence is the **parent company**; OurDigital is its
|
||||
**SEO-specialty child brand**. The rebrand-to-OurDigital rule only applies
|
||||
when the asset is SEO-related. Non-SEO D.intelligence assets (consulting,
|
||||
data, training in other practices) keep the D.intelligence name because
|
||||
they belong to the parent company, not to OurDigital.
|
||||
|
||||
**Resolution**:
|
||||
- Inside an SEO context (`02_SEO in Action/`, `00_OurDigital/04_SEO/`, or
|
||||
any folder whose name contains "SEO"): apply the standard rename
|
||||
`D.intelligence … → OurDigital …`.
|
||||
- Outside SEO context: **do not rename**. Flag for user review and
|
||||
document the asset's intended owning practice.
|
||||
- The `RENAME_RULES` in `code/organizer.py` cover three variants
|
||||
(`D.intelligence Lab-`, `D.intelligence`, and the no-dot `D intelligence`
|
||||
typo). The rules don't enforce the SEO-context caveat — that's the
|
||||
caller's responsibility (point the script at an SEO folder, not the
|
||||
whole Drive Stream).
|
||||
|
||||
---
|
||||
|
||||
### Brand-variant typos that escape the regex
|
||||
|
||||
**Pattern**: A filename uses an off-spec spelling of `D.intelligence` —
|
||||
e.g., `D intelligence SEO Audit & Treatment.pdf` (no dot), or
|
||||
`OurDigitial-…` (transposed letters), or `Techincal SEO` (transposed).
|
||||
|
||||
**Why tricky**: The standard `D\.intelligence` regex requires the literal
|
||||
dot, so the no-dot variant slips through. Same for OurDigital typos —
|
||||
they don't match the brand pattern at all and look like normal filenames.
|
||||
|
||||
**Resolution**:
|
||||
1. When you find one during a manual review, do the rename via `mv` and
|
||||
immediately consider whether to add a regex variant to `RENAME_RULES`.
|
||||
2. The current rules cover: `D.intelligence Lab-`, `D.intelligence`, and
|
||||
`D intelligence` (no-dot, word-boundaries to avoid false positives).
|
||||
3. Common typos that are NOT in regex (because they're one-off mistakes):
|
||||
`OurDigitial`, `Techincal`. Catch with `mv` during manual review.
|
||||
|
||||
---
|
||||
|
||||
### Real client names in `예시 자료 모음/`
|
||||
|
||||
**Pattern**: Files in `02_…/예시 자료 모음/` that still have real client
|
||||
names in the filename — e.g., `OurDigital-SEO Audit-1gada.com-20240703.xlsx`,
|
||||
`OurDigital-Sono International-Preliminary SEO Audit-20240927.gdoc`.
|
||||
|
||||
**Why tricky**: The folder's canonical role is "neutralized example
|
||||
deliverables" — examples to show in pre-sales without exposing real client
|
||||
data. A file with a real client name in this folder is a half-done
|
||||
neutralization. The original engagement copy usually exists elsewhere
|
||||
(`99_Project Archive/{NN_client}/` or `04_Case Studies/`).
|
||||
|
||||
**Resolution**:
|
||||
1. Filesystem rename to neutralize the FILENAME using `OOO`-style
|
||||
placeholders: `OurDigital-OOO 호텔 체인-Preliminary SEO Audit-…gdoc`.
|
||||
2. Add to a `TODO.md` reminding the user to also neutralize CELL CONTENT
|
||||
(real names, contact info, URLs, keyword examples) inside the source
|
||||
Sheet/Doc — filesystem rename doesn't touch cell content.
|
||||
3. Don't delete the file even though the original exists elsewhere — the
|
||||
neutralized example serves a different purpose (sales / training) than
|
||||
the archived original (engagement record).
|
||||
4. If the original doesn't exist elsewhere, copy it to the right archive
|
||||
folder FIRST before neutralizing the example.
|
||||
|
||||
---
|
||||
|
||||
### Near-duplicate templates across `문서 양식/` and `05_Working Template/`
|
||||
|
||||
**Pattern**: Same template name in both
|
||||
`02_…/문서 양식/OurDigital-SEO Audit Template-{date1}.gsheet` and
|
||||
`05_Working Template/OurDigital-SEO Audit Template-{date2}.gsheet` with
|
||||
different dates (and different Doc IDs).
|
||||
|
||||
**Why tricky**: Looks like the same template at v1 and v2 (good cleanup
|
||||
target — keep the newer, archive the older). But sometimes they're
|
||||
genuinely different templates that just happen to share a name.
|
||||
|
||||
**Resolution**:
|
||||
1. `cmp` the .gsheet stubs first. Always different (different Doc IDs)
|
||||
for files at different dates — that just confirms they're separate
|
||||
Drive Docs, not bytes-identical stubs.
|
||||
2. The Doc IDs alone can't tell you whether the cell content is similar.
|
||||
Open both Sheets in Google Drive. Usually one is a direct refinement
|
||||
of the other (older = v1, newer = v2 with added rows/columns).
|
||||
3. If clearly v1 / v2 of same template: delete v1, OR move v1 to
|
||||
`05_Working Template/` with `(legacy v1)` suffix.
|
||||
4. If genuinely different (e.g., one is "quick check" and other is
|
||||
"comprehensive"): rename to disambiguate explicitly.
|
||||
5. Always defer to the user for the open-and-compare step. Add to
|
||||
`TODO.md` with both Doc IDs + paths so the user knows what to compare.
|
||||
|
||||
---
|
||||
|
||||
### Stray screenshot that turns out to be a process diagram
|
||||
|
||||
**Pattern**: A `Screenshot_YYYY-MM-DD…png` in a folder of templates that
|
||||
the script's `MOVE_RULES` would normally route to a `screenshots/` subdir.
|
||||
|
||||
**Why tricky**: The MOVE_RULES regex (`^Screenshot \d{4}-\d{2}-\d{2}…`)
|
||||
treats anything with that prefix as junk to be tucked away. But sometimes
|
||||
the screenshot is actually a captured workflow diagram, org chart, or
|
||||
reference visualization that has real value AND a meaningful home elsewhere.
|
||||
|
||||
**Resolution**:
|
||||
- Always view the screenshot before moving it (use `Read` on the .png).
|
||||
- If it's a diagram / reference visualization: rename to a descriptive
|
||||
filename and move to the most relevant subfolder (often `참고 자료/`
|
||||
for audit-toolkit context, `docs/` for code-related).
|
||||
- If it's an actual junk screenshot (UI snapshot during work): apply the
|
||||
default rule and move to `screenshots/`.
|
||||
- The MOVE_RULES regex pattern uses the macOS default
|
||||
`Screenshot YYYY-MM-DD at HH.MM.SS AM/PM.png` (with spaces). The
|
||||
underscore variant `Screenshot_YYYY-MM-DD_at_*` does NOT match —
|
||||
catch those manually during content review.
|
||||
|
||||
---
|
||||
|
||||
## Adding new gotchas
|
||||
|
||||
When you (Claude) encounter a new ambiguous case during a content-based
|
||||
reorganization session, add an entry here BEFORE moving on. Format:
|
||||
|
||||
```
|
||||
### Short pattern title
|
||||
|
||||
**Pattern**: filename / structure example.
|
||||
|
||||
**Why tricky**: what makes this hard.
|
||||
|
||||
**Resolution**: what to do.
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
This is how the system gets smarter over time. The patterns library is
|
||||
the institutional memory.
|
||||
Reference in New Issue
Block a user