Ghost Catalog Skill
Manage semantic file headers and maintain the Ghost Catalog database for any workspace.
Header Format (SOM File ID)
Every cataloged file gets a semantic header in the first 20 lines:
# file_id: SOM-XXX-NNNN-vX.X.X
# name: filename.ext
# description: What this file does
# project_id: PROJECT-NAME
# category: script | doc | config | schema | component | test | data | style
# tags: [tag1, tag2, tag3]
# created: YYYY-MM-DD
# modified: YYYY-MM-DD
# version: X.X.X
# agent_id: AGENT-DROID-001
Comment style adapts to file type:
- Python/Shell/YAML/TOML:
# prefix
- JavaScript/TypeScript/Go/Rust/C:
// prefix inside /* ... */ block
- HTML/XML:
<!-- ... --> block
- Markdown:
<!-- ... --> HTML comment block
- CSS:
/* ... */ block
- SQL:
-- prefix
File ID Schema: SOM-XXX-NNNN-vX.X.X
| Segment |
Meaning |
Examples |
SOM |
Somacosf namespace (constant) |
SOM |
XXX |
3-letter category code |
SCR (script), DOC (doc), CFG (config), SCH (schema), CMP (component), TST (test), DAT (data), STY (style), LIB (library), API (api route), UTL (utility), HKS (hooks) |
NNNN |
4-digit sequential number |
0001, 0042, 0338 |
vX.X.X |
Semantic version |
v1.0.0, v2.1.3 |
Category Codes
| Code |
Category |
File Types |
SCR |
Script |
.py, .sh, .ps1, .bat |
DOC |
Document |
.md, .txt, .rst |
CFG |
Config |
.json, .yaml, .yml, .toml, .env, .ini |
SCH |
Schema |
.prisma, .graphql, .sql |
CMP |
Component |
.tsx, .jsx, .vue, .svelte |
TST |
Test |
*.test.*, *.spec.* |
DAT |
Data |
.csv, .json (data files), .db |
STY |
Style |
.css, .scss, .less |
LIB |
Library |
.ts, .js (lib modules) |
API |
API Route |
route.ts, route.js (Next.js API routes) |
UTL |
Utility |
Helper/utility modules |
HKS |
Hooks |
React hooks, git hooks |
Catalog Database
The catalog lives at data/ghost-catalog.db (SQLite). Schema:
CREATE TABLE IF NOT EXISTS file_catalog (
file_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
path TEXT NOT NULL,
project_id TEXT,
category TEXT,
version TEXT,
created TEXT,
modified TEXT,
agent_id TEXT,
execution TEXT,
checksum TEXT,
last_synced TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS file_tags (
file_id TEXT,
tag TEXT,
PRIMARY KEY (file_id, tag),
FOREIGN KEY (file_id) REFERENCES file_catalog(file_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS agent_registry (
id TEXT PRIMARY KEY,
name TEXT,
model TEXT,
first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_active TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_category ON file_catalog(category);
CREATE INDEX IF NOT EXISTS idx_project ON file_catalog(project_id);
CREATE INDEX IF NOT EXISTS idx_agent ON file_catalog(agent_id);
CREATE INDEX IF NOT EXISTS idx_tags ON file_tags(tag);
Commands
When the user invokes /ghost-catalog, determine which operation to perform based on their request. Default to scan if no specific command is given.
1. scan (default)
Scan the workspace for all source files. For each file:
- Check if it already has a SOM header (look for
file_id: SOM- in first 20 lines)
- If header exists: parse and validate it, update the catalog DB
- If no header: report it as untagged
Output a summary table:
Scanned: 150 files
Tagged: 42 files (28%)
Untagged: 108 files
Errors: 0
Ignore system (layered, merged at scan time):
.ghost_ignore (primary) -- Ghost Catalog's own ignore file, lives at project root. Follows .gitignore syntax. This is the canonical source of what to skip.
.gitignore (inherited) -- automatically merged; anything git ignores, Ghost Catalog ignores too.
- Hardcoded fallbacks -- if neither file exists, use:
.git/, node_modules/, .next/, .vercel/, __pycache__/, .venv/, dist/, build/, .factory/
When scanning, parse .ghost_ignore and .gitignore into a combined exclusion set. Only scan files that survive both filters. The goal: catalog project files only -- no dependencies, no build artifacts, no binaries, no secrets, no lock files.
2. tag <path|pattern>
Apply a Ghost Catalog header to one or more files:
- Read the file content
- Determine the category from file extension and location
- Query the catalog DB for the next available sequence number in that category
- Generate the header with appropriate comment syntax
- Prepend the header to the file (preserve existing content)
- Insert into the catalog DB
When tagging multiple files, show a preview table first and ask for confirmation before applying.
3. validate
Check all tagged files for header compliance:
- Required fields present:
file_id, name, description, category, version, created, modified
- File ID format valid:
SOM-XXX-NNNN-vX.X.X
- Version in file_id matches version field
- Filename in header matches actual filename
- No duplicate file IDs
Output a validation report with pass/warn/fail for each file.
4. search <query>
Search the catalog by any field:
search proxy - fuzzy match on name/description
search --category script - filter by category
search --tag opentelemetry - filter by tag
search --agent AGENT-CLAUDE-002 - filter by agent
Display results as a formatted table with file_id, name, category, and path.
5. info <file_id>
Show detailed metadata for a specific file from the catalog DB.
6. stats
Show catalog statistics:
- Total files, tagged vs untagged
- Breakdown by category
- Top tags
- Agent activity
- Last sync time
7. report
Generate a full compliance report in markdown format, saved to docs/ghost-catalog-report.md.
Implementation Notes
- Use Python 3 with
sqlite3 stdlib for database operations
- For scanning, use the Glob and Read tools rather than spawning processes
- When generating headers, always check what comment style the file uses
- Sequence numbers are global per category (not per project)
- The catalog DB should be created at
data/ghost-catalog.db if it doesn't exist
- Always use
AGENT-DROID-001 as the agent_id when this skill applies headers
- Version starts at
v1.0.0 for new files
modified date is always today's date when applying or updating headers
created date is preserved if already set, otherwise today's date
Verification
After any write operation (tag, validate --fix), re-read the modified files to confirm headers were applied correctly. Report any failures.
Auto-Invocation Guidance
This skill should be considered when:
- The user asks about file organization, cataloging, or headers
- A scan reveals many untagged files and the user wants to fix compliance
- The user creates new files and wants them cataloged
- The user asks "what files are in this project" or "show me the catalog"
1---2name: ghost-catalog3description: Scan, tag, validate, and catalog files using the Ghost Catalog semantic file header system (SOM-XXX-NNNN-vX.X.X). Use when: discovering untagged files, onboarding to a new codebase, maintaining catalog compliance, searching for files by category/tag/agent, or generating compliance reports. Operates on the local file system with a SQLite catalog database.4---5
6# Ghost Catalog Skill
7
8Manage semantic file headers and maintain the Ghost Catalog database for any workspace.
9
10## Header Format (SOM File ID)
11
12Every cataloged file gets a semantic header in the first 20 lines:
13
14```
15# file_id: SOM-XXX-NNNN-vX.X.X
16# name: filename.ext
17# description: What this file does
18# project_id: PROJECT-NAME
19# category: script | doc | config | schema | component | test | data | style
20# tags: [tag1, tag2, tag3]
21# created: YYYY-MM-DD
22# modified: YYYY-MM-DD
23# version: X.X.X
24# agent_id: AGENT-DROID-001
25```
26
27Comment style adapts to file type:
28- Python/Shell/YAML/TOML: `#` prefix
29- JavaScript/TypeScript/Go/Rust/C: `//` prefix inside `/* ... */` block
30- HTML/XML: `<!-- ... -->` block
31- Markdown: `<!-- ... -->` HTML comment block
32- CSS: `/* ... */` block
33- SQL: `--` prefix
34
35### File ID Schema: `SOM-XXX-NNNN-vX.X.X`
36
37| Segment | Meaning | Examples |
38|---------|---------|----------|
39| `SOM` | Somacosf namespace (constant) | `SOM` |
40| `XXX` | 3-letter category code | `SCR` (script), `DOC` (doc), `CFG` (config), `SCH` (schema), `CMP` (component), `TST` (test), `DAT` (data), `STY` (style), `LIB` (library), `API` (api route), `UTL` (utility), `HKS` (hooks) |
41| `NNNN` | 4-digit sequential number | `0001`, `0042`, `0338` |
42| `vX.X.X` | Semantic version | `v1.0.0`, `v2.1.3` |
43
44### Category Codes
45
46| Code | Category | File Types |
47|------|----------|------------|
48| `SCR` | Script | `.py`, `.sh`, `.ps1`, `.bat` |
49| `DOC` | Document | `.md`, `.txt`, `.rst` |
50| `CFG` | Config | `.json`, `.yaml`, `.yml`, `.toml`, `.env`, `.ini` |
51| `SCH` | Schema | `.prisma`, `.graphql`, `.sql` |
52| `CMP` | Component | `.tsx`, `.jsx`, `.vue`, `.svelte` |
53| `TST` | Test | `*.test.*`, `*.spec.*` |
54| `DAT` | Data | `.csv`, `.json` (data files), `.db` |
55| `STY` | Style | `.css`, `.scss`, `.less` |
56| `LIB` | Library | `.ts`, `.js` (lib modules) |
57| `API` | API Route | `route.ts`, `route.js` (Next.js API routes) |
58| `UTL` | Utility | Helper/utility modules |
59| `HKS` | Hooks | React hooks, git hooks |
60
61## Catalog Database
62
63The catalog lives at `data/ghost-catalog.db` (SQLite). Schema:
64
65```sql
66CREATE TABLE IF NOT EXISTS file_catalog (
67 file_id TEXT PRIMARY KEY,
68 name TEXT NOT NULL,
69 description TEXT,
70 path TEXT NOT NULL,
71 project_id TEXT,
72 category TEXT,
73 version TEXT,
74 created TEXT,
75 modified TEXT,
76 agent_id TEXT,
77 execution TEXT,
78 checksum TEXT,
79 last_synced TIMESTAMP DEFAULT CURRENT_TIMESTAMP
80);
81
82CREATE TABLE IF NOT EXISTS file_tags (
83 file_id TEXT,
84 tag TEXT,
85 PRIMARY KEY (file_id, tag),
86 FOREIGN KEY (file_id) REFERENCES file_catalog(file_id) ON DELETE CASCADE
87);
88
89CREATE TABLE IF NOT EXISTS agent_registry (
90 id TEXT PRIMARY KEY,
91 name TEXT,
92 model TEXT,
93 first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
94 last_active TIMESTAMP
95);
96
97CREATE INDEX IF NOT EXISTS idx_category ON file_catalog(category);
98CREATE INDEX IF NOT EXISTS idx_project ON file_catalog(project_id);
99CREATE INDEX IF NOT EXISTS idx_agent ON file_catalog(agent_id);
100CREATE INDEX IF NOT EXISTS idx_tags ON file_tags(tag);
101```
102
103## Commands
104
105When the user invokes `/ghost-catalog`, determine which operation to perform based on their request. Default to `scan` if no specific command is given.
106
107### 1. `scan` (default)
108
109Scan the workspace for all source files. For each file:
1101. Check if it already has a SOM header (look for `file_id: SOM-` in first 20 lines)
1112. If header exists: parse and validate it, update the catalog DB
1123. If no header: report it as untagged
113
114Output a summary table:
115```
116Scanned: 150 files
117Tagged: 42 files (28%)
118Untagged: 108 files
119Errors: 0
120```
121
122**Ignore system** (layered, merged at scan time):
123
1241. `.ghost_ignore` (primary) -- Ghost Catalog's own ignore file, lives at project root. Follows `.gitignore` syntax. This is the canonical source of what to skip.
1252. `.gitignore` (inherited) -- automatically merged; anything git ignores, Ghost Catalog ignores too.
1263. Hardcoded fallbacks -- if neither file exists, use: `.git/`, `node_modules/`, `.next/`, `.vercel/`, `__pycache__/`, `.venv/`, `dist/`, `build/`, `.factory/`
127
128When scanning, parse `.ghost_ignore` and `.gitignore` into a combined exclusion set. Only scan files that survive both filters. The goal: **catalog project files only** -- no dependencies, no build artifacts, no binaries, no secrets, no lock files.
129
130### 2. `tag <path|pattern>`
131
132Apply a Ghost Catalog header to one or more files:
133
1341. Read the file content
1352. Determine the category from file extension and location
1363. Query the catalog DB for the next available sequence number in that category
1374. Generate the header with appropriate comment syntax
1385. Prepend the header to the file (preserve existing content)
1396. Insert into the catalog DB
140
141When tagging multiple files, show a preview table first and ask for confirmation before applying.
142
143### 3. `validate`
144
145Check all tagged files for header compliance:
146- Required fields present: `file_id`, `name`, `description`, `category`, `version`, `created`, `modified`
147- File ID format valid: `SOM-XXX-NNNN-vX.X.X`
148- Version in file_id matches version field
149- Filename in header matches actual filename
150- No duplicate file IDs
151
152Output a validation report with pass/warn/fail for each file.
153
154### 4. `search <query>`
155
156Search the catalog by any field:
157- `search proxy` - fuzzy match on name/description
158- `search --category script` - filter by category
159- `search --tag opentelemetry` - filter by tag
160- `search --agent AGENT-CLAUDE-002` - filter by agent
161
162Display results as a formatted table with file_id, name, category, and path.
163
164### 5. `info <file_id>`
165
166Show detailed metadata for a specific file from the catalog DB.
167
168### 6. `stats`
169
170Show catalog statistics:
171- Total files, tagged vs untagged
172- Breakdown by category
173- Top tags
174- Agent activity
175- Last sync time
176
177### 7. `report`
178
179Generate a full compliance report in markdown format, saved to `docs/ghost-catalog-report.md`.
180
181## Implementation Notes
182
183- Use Python 3 with `sqlite3` stdlib for database operations
184- For scanning, use the Glob and Read tools rather than spawning processes
185- When generating headers, always check what comment style the file uses
186- Sequence numbers are global per category (not per project)
187- The catalog DB should be created at `data/ghost-catalog.db` if it doesn't exist
188- Always use `AGENT-DROID-001` as the agent_id when this skill applies headers
189- Version starts at `v1.0.0` for new files
190- `modified` date is always today's date when applying or updating headers
191- `created` date is preserved if already set, otherwise today's date
192
193## Verification
194
195After any write operation (tag, validate --fix), re-read the modified files to confirm headers were applied correctly. Report any failures.
196
197## Auto-Invocation Guidance
198
199This skill should be considered when:
200- The user asks about file organization, cataloging, or headers
201- A scan reveals many untagged files and the user wants to fix compliance
202- The user creates new files and wants them cataloged
203- The user asks "what files are in this project" or "show me the catalog"