Two leftovers from the rebrand, done together because they touch the same docs and manifests. **Data directory.** `agent-dashboard` could not simply be renamed in the source: it names a real directory holding the live SQLite database. Startup now moves it once, via `migrateLegacyDataDir()` in `server/lib/claude-home.js` — a same-filesystem rename, so it is instant even at multiple gigabytes and cannot leave two divergent copies. `getDataDir()` stays PURE and resolves to the legacy path until the move happens; the first version of this put the rename inside the getter, which meant `npm run test:server` relocated the developer's real database as a side effect. The call sits behind `require.main === module` and ahead of the router requires, because those pull in db.js, which opens SQLite at module load. A failed rename is silent and the old directory keeps being used: an unfashionable directory name beats a blank database beside an unreachable one. Same treatment for the port-discovery file (`.agent-dashboard.json` → `.agenthub.json`, old one dropped on write). Not renamed on purpose: the Sagi localStorage keys (renaming silently resets everyone's prefs) and the PWA manifest `id` (changing it orphans an installed app). **MCP server.** 4 tool calls in 46 days across 577,132 events, against 4,556 lines of TypeScript, a 2 MB committed build artifact, and a pre-commit guard that had already blocked commits twice. Deleted: `mcp/`, the maintainer skills and `mcp-reviewer` agent, the build check, `plugins/agenthub/.mcp.json`, `docs/MCP.md`, 12 npm scripts, 5 Makefile targets, and every doc section describing it. Kept, because they are unrelated things sharing the name: the Config Explorer's MCP tab and its API, per-lane Playwright MCP, the agenthub-config plugin's MCP audit, and the historical `mcp__plugin_agenthub_*` events that analytics must keep attributing. Verified: server 1432/1432, client 459/459, tsc clean, prettier clean. Both directions of the migration proven — a sandbox-HOME test run leaves the legacy directory untouched, and a real boot moves it with its contents intact.
4.6 KiB
name, description
| name | description |
|---|---|
| file-headers | MANDATORY for every coding agent (Claude Code, Codex, or any other) on every change-set — every applicable source file the agent creates or updates MUST start with the project's copyright/authorship header (file overview + exact author line). Use automatically whenever writing a new file or editing an existing one; do not wait to be asked. Covers JS/TS/TSX/CJS/MJS, Python, shell, and CSS. Includes the audit script to verify repo-wide compliance. |
File Headers — Copyright Comment + File Overview
Every applicable source file in this repository starts with a header comment containing a file overview and the exact author line:
@author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
The name and email must be exactly as above — no variations, no substitutions, no other names. This applies to every coding agent working in this repo (Claude Code, Codex, or any other tool): when you create a new applicable file, write the header first; when you update an existing applicable file that is missing the header, add it as part of the same change.
Applicable files
| Included | Excluded |
|---|---|
*.js, *.ts, *.tsx, *.cjs, *.mjs |
anything under node_modules/, dist/, build/, data/ |
*.py, *.sh |
vendored/minified files (*.min.js) |
*.css |
generated files (they carry their own AUTO-GENERATED banner) |
snapshots (__snapshots__/), lockfiles, JSON/YAML/Markdown |
|
anything gitignored — local runtime state that happens to live in the checkout (a lane's own .agenthub/profile/hooks/*.sh, a scratch venv) is not this repo's source and can never be made compliant here |
Header formats by file type
JS / TS / TSX — server & scripts style (overview inline in @file):
/**
* @file One-to-few-sentence overview of what this file does and why it
* exists. Mention the key contracts or invariants the file owns.
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
*/
JS / TS / TSX — client style (@file name + @description overview), used
under client/src/:
/**
* @file ComponentName.tsx
* @description What the component/module renders or provides and how it fits
* into the app.
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
*/
CSS (same block-comment shape as client/src/index.css):
/**
* @file file.css
* @description What these styles cover.
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
*/
Shell (# block right after the shebang; existing overview comments count —
just make sure the @author line is in the block):
#!/usr/bin/env bash
# script-name.sh — what the script does, one to few lines.
# @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
Python (inside the module docstring):
"""
module.py — what the module does.
@author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
"""
Rules
- New file → header first. Any applicable file you create starts with the header before any code (after the shebang for scripts).
- Touched file missing header → add it. If you edit a file that lacks the header, add one in the same commit. Write a real overview — describe what the file actually does; never a placeholder like "TODO" or "utility file".
- Exact author line.
@author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>— byte-exact, in every file type (shell and Python use it inside#/ docstring comments). - Don't churn existing headers. If a file already has a compliant header, leave it alone unless the file's purpose changed (then update the overview).
- Overviews must stay truthful. When an edit changes what a file does,
update its
@file/@descriptionoverview in the same change.
Audit
Run the bundled checker to list any applicable file missing the header:
bash skills/file-headers/scripts/check-headers.sh
Exit code 0 = fully compliant; 1 = the printed files are missing headers.
Run it before finishing any change-set that adds files, and during reviews.
It audits the files git can see — tracked plus untracked-but-not-ignored —
so a file you just wrote is caught before it is staged, while gitignored local
runtime state is not reported. It therefore needs to run inside a git work tree
and exits 1 with a message if it is not.
On every pull request, GitHub Actions runs
skills/file-headers/scripts/check-headers-pr.sh against only the
files changed in the PR diff (added, copied, renamed, or modified). Test locally
before pushing:
bash skills/file-headers/scripts/check-headers-pr.sh origin/master HEAD