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:
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