arch-upkeep
arch-upkeep is a meta architecture skill for keeping existing projects aligned with the canonical starter stacks:
arch-tsdown-monorepo — pnpm monorepo for TS libs with tsdown per package
arch-tsdown — single-package TS library with tsdown
arch-tsdown-cli — CLI apps built on tsdown
arch-unplugin — libraries built as unplugin (Vite/Rollup/Webpack/ESBuild)
arch-webext-vue — browser extensions using Vue
arch-vscode — VS Code extensions
Use this skill when a project already exists and you want to:
- Identify what architecture it currently matches (lib / CLI / monorepo / webext / vscode / unplugin / mixed)
- Plan a migration to one of the canonical
arch-* starters
- Incrementally upgrade tooling, scripts, and CI without rewriting app logic
This skill does not re-specify each architecture in detail — it helps you pick which arch-skill to apply and in what order.
Quick start
- Classify the repo using the checks in 1. Detect current architecture.
- Map to target skills using 2. Choose the target architecture skill(s).
- Ensure required
arch-* skills are installed via 2.1 Check & install required skills.
- Plan incremental migration using 3. Migration strategy (incremental) and 4. Architecture-specific notes.
- Run an upkeep pass with the checklist in 5. Checklist: running an “arch upkeep” on a repo.
1. Detect current architecture
Start by classifying the repo. Use these quick heuristics (you can apply multiple, projects may be “monorepo + CLI” etc.):
Monorepo (arch-tsdown-monorepo candidate)
- Has
pnpm-workspace.yaml or packages/*, apps/*, or similar layout
- Multiple
package.json files under packages/ or apps/
- Shared tooling at root (
eslint.config.*, vitest.config.*, tsconfig.base.json, etc.)
Single TS library (arch-tsdown candidate)
- Single
package.json at root
- Library-style exports (
main, module, types, maybe exports)
- No
bin entrypoint, no browser manifest, no VS Code extension manifest
CLI (arch-tsdown-cli candidate)
- Root
package.json with "bin" or "package.json#exports" pointing to CLI entry
- Uses
#!/usr/bin/env node in entry file
- Often depends on
cac, commander, yargs, etc.
unplugin-based library (arch-unplugin candidate)
- Depends on
unplugin
- Exports
createUnplugin, or has files under src/core/, src/vite.ts, src/webpack.ts, etc.
- Targets bundlers (Vite/Rollup/Webpack/ESBuild)
Browser extension + Vue (arch-webext-vue candidate)
- Has
manifest.json/manifest.v3.json (Chrome/Firefox extension)
- Vue SPA for popup/options or content scripts
- Build tooling around web extension dev (
web-ext, wxt, or custom scripts)
VS Code extension (arch-vscode candidate)
- Has
package.json with "contributes", "activationEvents", "engines.vscode"
src/extension.ts or similar activation entry
Once you know what it “mostly is”, pick one primary architecture as the upgrade target. If the repo is mixed (e.g. monorepo with a CLI package), pair arch-tsdown-monorepo with the relevant per-package skill (arch-tsdown, arch-tsdown-cli, etc.).
2. Choose the target architecture skill(s)
Map your classification to the canonical skills:
- pnpm multi-package repo → start with
arch-tsdown-monorepo
- Single TS library →
arch-tsdown
- CLI (single or inside a monorepo package) →
arch-tsdown-cli
- unplugin lib →
arch-unplugin (often inside an arch-tsdown or monorepo setup)
- Browser extension + Vue →
arch-webext-vue (app layer) plus arch-tsdown for any shared libs
- VS Code extension →
arch-vscode (extension app) plus arch-tsdown for shared libs
Then:
- Open the corresponding
arch-* skill(s).
- Use their “overview” / “core” references as the target design you want your existing repo to converge to.
- Plan an incremental migration: configs and scripts first, CI next, then release automation.
2.1 Check & install required skills
Because arch-upkeep is only an orchestrator, it expects the concrete arch-* skills to be installed and usable in the agent environment.
Recommended flow:
List installed skills in your agent runtime
- Use your platform’s “list skills” command / UI (for example, look for
arch-tsdown-monorepo, arch-tsdown, arch-tsdown-cli, arch-unplugin, arch-webext-vue, arch-vscode).
- If a target architecture skill is already present, you can call it directly.
If a required skill is missing, install it by name
- From the Agent Skills catalog (or your platform’s marketplace), search for the exact name, e.g.
arch-tsdown-monorepo.
- Install it into the current agent profile / workspace.
Verify installation before proceeding
- Re-run the “list skills” view and confirm the skill appears and is enabled.
- Optionally open its
SKILL.md (or skill details in UI) to confirm version and scope.
Compose multiple skills in one upkeep session
- For monorepo + CLI: use
arch-tsdown-monorepo + arch-tsdown-cli on the CLI package, and arch-tsdown for shared libs.
- For VS Code extension with shared libs: use
arch-vscode for the extension host + arch-tsdown for shared modules.
- For web extension + shared TS libs: use
arch-webext-vue for the extension app + arch-tsdown for the reusable packages.
Only after the relevant skills are installed and verified should you start applying the migration steps below.
3. Migration strategy (incremental)
General principles:
- Do not rewrite app logic. Only swap out infrastructure (build, test, lint, CI, release).
- One layer at a time. Avoid changing bundler, test runner, and tsconfig all in a single PR if you can split it.
- Keep Git history readable. Separate commits for “tooling move” vs “code fixes”.
Recommended order:
Normalize package layout
- For monorepos: align
packages/* layout, root package.json, workspace ranges, pnpm catalogs as per arch-tsdown-monorepo.
- For single packages: align folder structure (
src/, dist/, tests/), tsconfig names, etc. with arch-tsdown.
Migrate build to tsdown (where applicable)
- Replace legacy build scripts (
tsc, rollup, tsup, etc.) with tsdown configs from the target skill.
- Ensure
package.json#exports, main/module/types, and files fields match the target pattern.
Align testing and linting
- Move to the recommended test runner (Vitest) and ESLint setup from the relevant arch skill.
- For monorepos, centralize configs at root with per-package overrides where needed.
Synchronize scripts
- Standardize on the script names from the target architecture (
build, dev, test, lint, typecheck, release, etc.).
- For monorepos, prefer root scripts using
pnpm -r or pnpm --filter.
Upgrade CI and release
- Adopt the GitHub Actions / release workflows from the relevant arch skills.
- If applicable, migrate to npm Trusted Publisher, tag-based release, and
bumpp or similar.
Clean up
- Remove obsolete configs, scripts, and unused devDependencies once the new pipeline is green.
4. Architecture-specific notes
When targeting arch-tsdown-monorepo:
- Centralize tooling (ESLint, Vitest, TS base config) at root.
- Convert cross-package dependencies to
workspace:* ranges.
- Make each package buildable with tsdown independently.
When targeting arch-tsdown or arch-tsdown-cli:
- Treat the package as a canonical TS library/CLI; keep
src/ clean and side-effect free where possible.
- Ensure binary entrypoints are small bootstrap files that import from internal modules.
When targeting arch-unplugin:
- Keep the unplugin core small and composable.
- Provide clear exports for different bundlers (Vite, Rollup, Webpack, ESBuild) via the unified unplugin API.
When targeting arch-webext-vue:
- Separate app UI (Vue) from background/service worker logic and shared utilities.
- Prefer shared TS libs (using
arch-tsdown) for logic that can be reused outside the extension.
When targeting arch-vscode:
- Keep the extension host code (activation, commands) thin.
- Move heavy logic to shared TS libs where possible.
5. Checklist: running an “arch upkeep” on a repo
Use this as a repeatable workflow:
- Classify architecture (monorepo / lib / CLI / unplugin / webext / vscode).
- Pick the primary
arch-* skill(s) that match the desired end state.
- Read their overview/core references and write down the target structure and scripts.
- Plan incremental steps (layout → build → test/lint → CI → release).
- Apply changes while keeping app logic intact.
- Delete legacy tooling once the new pipeline passes.
After this, the project should look and behave like it was originally scaffolded from the chosen starter, which makes future maintenance and onboarding much easier.
1---
2name: arch-upkeep
3description: Architecture health-check and upgrade orchestrator. Use to detect a repo’s current shape (lib/cli/monorepo/webext/vscode/...) and migrate it onto the canonical tsdown-based starter architectures.
4metadata:
5 author: hairy
6 version: "2026.2.24"
7 source: Internal architecture upkeep workflow, composed from existing arch-* skills (arch-unplugin, arch-tsdown-monorepo, arch-tsdown-cli, arch-tsdown, arch-webext-vue, arch-vscode)
8---
9
10# arch-upkeep
11
12`arch-upkeep` is a **meta architecture skill** for keeping existing projects aligned with the canonical starter stacks:
13
14- `arch-tsdown-monorepo` — pnpm monorepo for TS libs with tsdown per package
15- `arch-tsdown` — single-package TS library with tsdown
16- `arch-tsdown-cli` — CLI apps built on tsdown
17- `arch-unplugin` — libraries built as unplugin (Vite/Rollup/Webpack/ESBuild)
18- `arch-webext-vue` — browser extensions using Vue
19- `arch-vscode` — VS Code extensions
20
21Use this skill when a project already exists and you want to:
22
23- **Identify** what architecture it currently matches (lib / CLI / monorepo / webext / vscode / unplugin / mixed)
24- **Plan** a migration to one of the canonical `arch-*` starters
25- **Incrementally upgrade** tooling, scripts, and CI without rewriting app logic
26
27> This skill does not re-specify each architecture in detail — it helps you pick **which arch-skill** to apply and in what order.
28
29## Quick start
30
311. **Classify the repo** using the checks in **1. Detect current architecture**.
322. **Map to target skills** using **2. Choose the target architecture skill(s)**.
333. **Ensure required `arch-*` skills are installed** via **2.1 Check & install required skills**.
344. **Plan incremental migration** using **3. Migration strategy (incremental)** and **4. Architecture-specific notes**.
355. **Run an upkeep pass** with the checklist in **5. Checklist: running an “arch upkeep” on a repo**.
36
37## 1. Detect current architecture
38
39Start by classifying the repo. Use these quick heuristics (you can apply multiple, projects may be “monorepo + CLI” etc.):
40
41- **Monorepo (`arch-tsdown-monorepo` candidate)**
42 - Has `pnpm-workspace.yaml` or `packages/*`, `apps/*`, or similar layout
43 - Multiple `package.json` files under `packages/` or `apps/`
44 - Shared tooling at root (`eslint.config.*`, `vitest.config.*`, `tsconfig.base.json`, etc.)
45
46- **Single TS library (`arch-tsdown` candidate)**
47 - Single `package.json` at root
48 - Library-style exports (`main`, `module`, `types`, maybe `exports`)
49 - No `bin` entrypoint, no browser manifest, no VS Code extension manifest
50
51- **CLI (`arch-tsdown-cli` candidate)**
52 - Root `package.json` with `"bin"` or `"package.json#exports"` pointing to CLI entry
53 - Uses `#!/usr/bin/env node` in entry file
54 - Often depends on `cac`, `commander`, `yargs`, etc.
55
56- **unplugin-based library (`arch-unplugin` candidate)**
57 - Depends on `unplugin`
58 - Exports `createUnplugin`, or has files under `src/core/`, `src/vite.ts`, `src/webpack.ts`, etc.
59 - Targets bundlers (Vite/Rollup/Webpack/ESBuild)
60
61- **Browser extension + Vue (`arch-webext-vue` candidate)**
62 - Has `manifest.json`/`manifest.v3.json` (Chrome/Firefox extension)
63 - Vue SPA for popup/options or content scripts
64 - Build tooling around web extension dev (`web-ext`, `wxt`, or custom scripts)
65
66- **VS Code extension (`arch-vscode` candidate)**
67 - Has `package.json` with `"contributes"`, `"activationEvents"`, `"engines.vscode"`
68 - `src/extension.ts` or similar activation entry
69
70Once you know what it “mostly is”, pick **one primary architecture** as the upgrade target. If the repo is mixed (e.g. monorepo with a CLI package), pair `arch-tsdown-monorepo` with the relevant per-package skill (`arch-tsdown`, `arch-tsdown-cli`, etc.).
71
72## 2. Choose the target architecture skill(s)
73
74Map your classification to the canonical skills:
75
76- **pnpm multi-package repo** → start with `arch-tsdown-monorepo`
77- **Single TS library** → `arch-tsdown`
78- **CLI** (single or inside a monorepo package) → `arch-tsdown-cli`
79- **unplugin** lib → `arch-unplugin` (often inside an `arch-tsdown` or monorepo setup)
80- **Browser extension + Vue** → `arch-webext-vue` (app layer) plus `arch-tsdown` for any shared libs
81- **VS Code extension** → `arch-vscode` (extension app) plus `arch-tsdown` for shared libs
82
83Then:
84
851. **Open the corresponding `arch-*` skill(s)**.
862. **Use their “overview” / “core” references** as the target design you want your existing repo to converge to.
873. Plan an incremental migration: configs and scripts first, CI next, then release automation.
88
89### 2.1 Check & install required skills
90
91Because `arch-upkeep` is only an orchestrator, it expects the concrete `arch-*` skills to be **installed and usable** in the agent environment.
92
93Recommended flow:
94
951. **List installed skills** in your agent runtime
96 - Use your platform’s “list skills” command / UI (for example, look for `arch-tsdown-monorepo`, `arch-tsdown`, `arch-tsdown-cli`, `arch-unplugin`, `arch-webext-vue`, `arch-vscode`).
97 - If a target architecture skill is already present, you can call it directly.
98
992. **If a required skill is missing, install it by name**
100 - From the Agent Skills catalog (or your platform’s marketplace), search for the exact name, e.g. `arch-tsdown-monorepo`.
101 - Install it into the current agent profile / workspace.
102
1033. **Verify installation before proceeding**
104 - Re-run the “list skills” view and confirm the skill appears and is enabled.
105 - Optionally open its `SKILL.md` (or skill details in UI) to confirm version and scope.
106
1074. **Compose multiple skills in one upkeep session**
108 - For **monorepo + CLI**: use `arch-tsdown-monorepo` + `arch-tsdown-cli` on the CLI package, and `arch-tsdown` for shared libs.
109 - For **VS Code extension with shared libs**: use `arch-vscode` for the extension host + `arch-tsdown` for shared modules.
110 - For **web extension + shared TS libs**: use `arch-webext-vue` for the extension app + `arch-tsdown` for the reusable packages.
111
112Only after the relevant skills are installed and verified should you start applying the migration steps below.
113
114## 3. Migration strategy (incremental)
115
116General principles:
117
118- **Do not rewrite app logic.** Only swap out **infrastructure** (build, test, lint, CI, release).
119- **One layer at a time.** Avoid changing bundler, test runner, and tsconfig all in a single PR if you can split it.
120- **Keep Git history readable.** Separate commits for “tooling move” vs “code fixes”.
121
122Recommended order:
123
1241. **Normalize package layout**
125 - For monorepos: align `packages/*` layout, root `package.json`, workspace ranges, pnpm catalogs as per `arch-tsdown-monorepo`.
126 - For single packages: align folder structure (`src/`, `dist/`, `tests/`), tsconfig names, etc. with `arch-tsdown`.
127
1282. **Migrate build to tsdown (where applicable)**
129 - Replace legacy build scripts (`tsc`, `rollup`, `tsup`, etc.) with `tsdown` configs from the target skill.
130 - Ensure `package.json#exports`, `main/module/types`, and `files` fields match the target pattern.
131
1323. **Align testing and linting**
133 - Move to the recommended test runner (Vitest) and ESLint setup from the relevant arch skill.
134 - For monorepos, centralize configs at root with per-package overrides where needed.
135
1364. **Synchronize scripts**
137 - Standardize on the script names from the target architecture (`build`, `dev`, `test`, `lint`, `typecheck`, `release`, etc.).
138 - For monorepos, prefer root scripts using `pnpm -r` or `pnpm --filter`.
139
1405. **Upgrade CI and release**
141 - Adopt the GitHub Actions / release workflows from the relevant arch skills.
142 - If applicable, migrate to **npm Trusted Publisher**, tag-based release, and `bumpp` or similar.
143
1446. **Clean up**
145 - Remove obsolete configs, scripts, and unused devDependencies once the new pipeline is green.
146
147## 4. Architecture-specific notes
148
149- **When targeting `arch-tsdown-monorepo`:**
150 - Centralize tooling (ESLint, Vitest, TS base config) at root.
151 - Convert cross-package dependencies to `workspace:*` ranges.
152 - Make each package buildable with tsdown independently.
153
154- **When targeting `arch-tsdown` or `arch-tsdown-cli`:**
155 - Treat the package as a canonical TS library/CLI; keep `src/` clean and side-effect free where possible.
156 - Ensure binary entrypoints are small bootstrap files that import from internal modules.
157
158- **When targeting `arch-unplugin`:**
159 - Keep the unplugin core small and composable.
160 - Provide clear exports for different bundlers (Vite, Rollup, Webpack, ESBuild) via the unified unplugin API.
161
162- **When targeting `arch-webext-vue`:**
163 - Separate app UI (Vue) from background/service worker logic and shared utilities.
164 - Prefer shared TS libs (using `arch-tsdown`) for logic that can be reused outside the extension.
165
166- **When targeting `arch-vscode`:**
167 - Keep the extension host code (activation, commands) thin.
168 - Move heavy logic to shared TS libs where possible.
169
170## 5. Checklist: running an “arch upkeep” on a repo
171
172Use this as a repeatable workflow:
173
1741. **Classify architecture** (monorepo / lib / CLI / unplugin / webext / vscode).
1752. **Pick the primary `arch-*` skill(s)** that match the desired end state.
1763. **Read their overview/core references** and write down the target structure and scripts.
1774. **Plan incremental steps** (layout → build → test/lint → CI → release).
1785. **Apply changes** while keeping app logic intact.
1796. **Delete legacy tooling** once the new pipeline passes.
180
181After this, the project should look and behave like it was originally scaffolded from the chosen starter, which makes future maintenance and onboarding much easier.