Initial commit
This commit is contained in:
222
commands/apply-template.md
Normal file
222
commands/apply-template.md
Normal file
@@ -0,0 +1,222 @@
|
||||
---
|
||||
description: Retroactively apply configuration and dev dependencies from boneskull-template to an existing project
|
||||
argument-hint: [target-directory]
|
||||
---
|
||||
|
||||
# /apply-template
|
||||
|
||||
## Purpose
|
||||
|
||||
Retroactively apply configuration files and development dependencies from the [boneskull-template](https://github.com/boneskull/boneskull-template) repository to an existing project, intelligently merging package.json and copying missing configuration files.
|
||||
|
||||
## Contract
|
||||
|
||||
**Inputs:** `target-directory` (optional) — Target project directory (defaults to current working directory)
|
||||
**Outputs:** Summary of changes made
|
||||
|
||||
## Instructions
|
||||
|
||||
### 1. Preparation
|
||||
|
||||
- Validate target directory exists and contains a `package.json`
|
||||
- Verify git working tree is clean in target (warn user if not)
|
||||
- Fetch or clone latest boneskull-template:
|
||||
- **Cache location:** `~/.cache/boneskull-template`
|
||||
- If cache exists: `cd ~/.cache/boneskull-template && git pull origin main`
|
||||
- If cache doesn't exist: `git clone https://github.com/boneskull/boneskull-template.git ~/.cache/boneskull-template`
|
||||
- This avoids repeated clones and speeds up subsequent runs
|
||||
|
||||
### 2. Ignore List
|
||||
|
||||
**Never copy these from template:**
|
||||
|
||||
- `docs/plans/`
|
||||
- `src/`
|
||||
- `test/`
|
||||
- `package-lock.json`
|
||||
- Any file that already exists in target project (EXCEPT `package.json`)
|
||||
|
||||
### 3. Merge package.json
|
||||
|
||||
**Strategy:** Use the `merge-package.js` script to intelligently merge dependencies
|
||||
|
||||
1. **Create backup:** `cp package.json package.json.backup`
|
||||
2. **Run merge script:**
|
||||
|
||||
```bash
|
||||
node plugins/tools/scripts/merge-package.js \
|
||||
<target-directory>/package.json \
|
||||
~/.cache/boneskull-template/package.json
|
||||
```
|
||||
|
||||
3. **Install dependencies:** Run `npm install` to install newly added dependencies
|
||||
4. **Clean up:** Delete `package.json.backup` after successful merge and install
|
||||
|
||||
The merge script automatically:
|
||||
|
||||
- Compares versions between template and target
|
||||
- Chooses the most recent semantic version
|
||||
- Adds any dependencies that exist only in template
|
||||
- Keeps any dependencies that exist only in target
|
||||
- Adds scripts from template that don't exist in target (preserves user customizations)
|
||||
- Adds missing fields like `engines`, `knip`, `lint-staged`, etc.
|
||||
- Merges prettier config and adds plugins
|
||||
|
||||
**Version comparison logic (handled by merge-package.js):**
|
||||
|
||||
```javascript
|
||||
// Use semver comparison - choose higher version
|
||||
// Examples:
|
||||
// "1.2.3" vs "1.2.4" → choose "1.2.4"
|
||||
// "^1.0.0" vs "^2.0.0" → choose "^2.0.0"
|
||||
// "~1.2.3" vs "1.2.4" → choose "1.2.4" (prefer exact)
|
||||
// "latest" vs "1.0.0" → choose "latest"
|
||||
```
|
||||
|
||||
### 4. Copy Configuration Files
|
||||
|
||||
**Strategy:** Copy files from template only if they don't exist in target
|
||||
|
||||
1. Get list of all files in template root (excluding ignored paths)
|
||||
2. For each file:
|
||||
- Skip if in ignore list
|
||||
- Skip if already exists in target
|
||||
- Copy to target if missing
|
||||
3. Handle `.github/` directory specially:
|
||||
- Copy `.github/` files that don't exist in target
|
||||
- Don't overwrite existing workflow files
|
||||
- Preserve target's existing .github structure
|
||||
|
||||
**Files to copy (if missing):**
|
||||
|
||||
- `.editorconfig`
|
||||
- `.gitattributes`
|
||||
- `.gitignore` (careful - may want to merge)
|
||||
- `.eslintrc.*` / `eslint.config.js`
|
||||
- `.prettierrc.*` / `prettier.config.js`
|
||||
- `.prettierignore`
|
||||
- `.commitlintrc.*`
|
||||
- `.markdownlint*`
|
||||
- `.npmrc`
|
||||
- `tsconfig.json`
|
||||
- `cspell.json`
|
||||
- `.husky/` directory and contents
|
||||
- `.github/` directory (non-overlapping files only)
|
||||
- `LICENSE` (only if missing)
|
||||
- Other dotfiles in root
|
||||
|
||||
### 5. Post-Application Steps
|
||||
|
||||
After all changes are complete, inform user they should:
|
||||
|
||||
1. **Review changes:**
|
||||
|
||||
```bash
|
||||
git diff package.json
|
||||
git status # See new files
|
||||
```
|
||||
|
||||
2. **Initialize tools if needed:**
|
||||
|
||||
```bash
|
||||
# If Husky was added:
|
||||
npm run prepare # or: npx husky install
|
||||
```
|
||||
|
||||
3. **Review and customize:**
|
||||
- Check new configuration files match project needs
|
||||
- Adjust scripts in package.json
|
||||
- Customize ESLint/Prettier rules
|
||||
- Update README with new tooling info
|
||||
|
||||
**Note:** Dependencies are automatically installed during step 3 (after merging package.json), so no separate `npm install` is needed unless the user wants to run it again.
|
||||
|
||||
### 6. Output Format
|
||||
|
||||
Provide clear summary of actions taken:
|
||||
|
||||
```text
|
||||
✅ Applied boneskull-template to project
|
||||
|
||||
Package.json changes:
|
||||
📦 Added dependencies: prettier, eslint, typescript
|
||||
📦 Updated dependencies: husky (8.0.0 → 9.0.0), lint-staged (15.0.0 → 16.0.0)
|
||||
📝 Added scripts: lint, format, test
|
||||
|
||||
Configuration files added:
|
||||
✨ .editorconfig
|
||||
✨ .prettierrc.json
|
||||
✨ eslint.config.js
|
||||
✨ tsconfig.json
|
||||
✨ .husky/pre-commit
|
||||
✨ .github/workflows/ci.yml
|
||||
|
||||
Files skipped (already exist):
|
||||
⏭️ .gitignore
|
||||
⏭️ LICENSE
|
||||
⏭️ .github/workflows/release.yml
|
||||
|
||||
Next steps:
|
||||
1. Review changes: git diff package.json && git status
|
||||
2. Initialize Husky: npm run prepare
|
||||
3. Customize configs as needed
|
||||
```
|
||||
|
||||
## Example Usage
|
||||
|
||||
```bash
|
||||
# Apply to current directory
|
||||
/tools:apply-template
|
||||
|
||||
# Apply to specific project
|
||||
/tools:apply-template ../my-project
|
||||
|
||||
# Apply to absolute path
|
||||
/tools:apply-template /Users/me/projects/my-app
|
||||
```
|
||||
|
||||
## Constraints
|
||||
|
||||
- **Never overwrite existing files** (except `package.json`)
|
||||
- **Always choose newer version** when merging dependencies
|
||||
- **Preserve user customizations** in scripts and configs
|
||||
- **Git working tree must be clean** (warn and exit if not)
|
||||
- **Validate package.json** after merge (must be valid JSON)
|
||||
- **Create backup** of original package.json before modifying
|
||||
- **Handle errors gracefully** (missing template, network issues, etc.)
|
||||
|
||||
## Edge Cases
|
||||
|
||||
1. **Git not clean:**
|
||||
- Warn user: "Working tree has uncommitted changes. Commit or stash before applying template."
|
||||
- Exit without making changes
|
||||
|
||||
2. **No package.json in target:**
|
||||
- Error: "Target directory is not a Node.js project (no package.json found)"
|
||||
- Exit
|
||||
|
||||
3. **Network error fetching template:**
|
||||
- Try local cached copy if available
|
||||
- Error if no cached copy: "Cannot fetch template. Check network connection."
|
||||
|
||||
4. **Version comparison ambiguity:**
|
||||
- If versions are equivalent (e.g., "^1.0.0" vs "~1.0.2"), prefer exact version
|
||||
- If can't parse version, keep target's version and warn user
|
||||
|
||||
5. **.gitignore conflicts:**
|
||||
- If target has .gitignore, DON'T overwrite
|
||||
- Consider offering to merge (show diff, ask user)
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
- **Template cache:** `~/.cache/boneskull-template`
|
||||
- **Template URL:** `https://github.com/boneskull/boneskull-template.git`
|
||||
- **Merge script:** `plugins/tools/scripts/merge-package.js` - handles all package.json merging logic
|
||||
- **Workflow:**
|
||||
1. Ensure template cache exists (clone if needed, pull if exists)
|
||||
2. Create package.json.backup
|
||||
3. Run merge-package.js script
|
||||
4. Run npm install
|
||||
5. Copy missing configuration files
|
||||
6. Delete package.json.backup
|
||||
7. Display summary of changes
|
||||
Reference in New Issue
Block a user