2025-08-01 07:04:22 -05:00
|
|
|
# VS Code Extension Development Guide
|
|
|
|
|
|
|
|
|
|
## 📁 File Structure Overview
|
|
|
|
|
|
|
|
|
|
This VS Code extension uses a **3-file packaging system** to avoid dependency conflicts during publishing:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
apps/extension/
|
|
|
|
|
├── package.json # Development configuration
|
|
|
|
|
├── package.publish.json # Clean publishing configuration
|
|
|
|
|
├── package.mjs # Build script for packaging
|
|
|
|
|
├── .vscodeignore # Files to exclude from extension package
|
|
|
|
|
└── vsix-build/ # Generated clean package directory
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 📋 File Purposes
|
|
|
|
|
|
|
|
|
|
### `package.json` (Development)
|
|
|
|
|
- **Purpose**: Development environment with all build tools
|
|
|
|
|
- **Contains**:
|
|
|
|
|
- All `devDependencies` needed for building
|
|
|
|
|
- Development scripts (`build`, `watch`, `lint`, etc.)
|
|
|
|
|
- Development package name: `"taskr"`
|
|
|
|
|
- **Used for**: Local development, building, testing
|
|
|
|
|
|
|
|
|
|
### `package.publish.json` (Publishing)
|
|
|
|
|
- **Purpose**: Clean distribution version for VS Code Marketplace
|
|
|
|
|
- **Contains**:
|
|
|
|
|
- **No devDependencies** (avoids dependency conflicts)
|
|
|
|
|
- Publishing metadata (`keywords`, `repository`, `categories`)
|
|
|
|
|
- Marketplace package name: `"taskr-kanban"`
|
|
|
|
|
- VS Code extension configuration
|
|
|
|
|
- **Used for**: Final extension packaging
|
|
|
|
|
|
|
|
|
|
### `package.mjs` (Build Script)
|
|
|
|
|
- **Purpose**: Creates clean package for distribution
|
|
|
|
|
- **Process**:
|
|
|
|
|
1. Builds the extension (`build:js` + `build:css`)
|
|
|
|
|
2. Creates clean `vsix-build/` directory
|
|
|
|
|
3. Copies only essential files (no source code)
|
|
|
|
|
4. Renames `package.publish.json` → `package.json`
|
|
|
|
|
5. Ready for `vsce package`
|
|
|
|
|
|
|
|
|
|
## 🚀 Development Workflow
|
|
|
|
|
|
|
|
|
|
### Local Development
|
|
|
|
|
```bash
|
|
|
|
|
# Install dependencies
|
|
|
|
|
npm install
|
|
|
|
|
|
|
|
|
|
# Start development with hot reload
|
|
|
|
|
npm run watch
|
|
|
|
|
|
|
|
|
|
# Run just JavaScript build
|
|
|
|
|
npm run build:js
|
|
|
|
|
|
|
|
|
|
# Run just CSS build
|
|
|
|
|
npm run build:css
|
|
|
|
|
|
|
|
|
|
# Full production build
|
|
|
|
|
npm run build
|
|
|
|
|
|
|
|
|
|
# Type checking
|
2025-10-21 21:16:15 +02:00
|
|
|
npm run typecheck
|
2025-08-01 07:04:22 -05:00
|
|
|
|
|
|
|
|
# Linting
|
|
|
|
|
npm run lint
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Testing in VS Code
|
|
|
|
|
1. Press `F5` in VS Code to launch Extension Development Host
|
|
|
|
|
2. Test your extension functionality in the new window
|
|
|
|
|
3. Use `Developer: Reload Window` to reload after changes
|
|
|
|
|
|
|
|
|
|
## 📦 Production Packaging
|
|
|
|
|
|
|
|
|
|
### Step 1: Build Clean Package
|
|
|
|
|
```bash
|
|
|
|
|
npm run package
|
|
|
|
|
```
|
|
|
|
|
This creates `vsix-build/` with clean distribution files.
|
|
|
|
|
|
|
|
|
|
### Step 2: Create VSIX
|
|
|
|
|
```bash
|
|
|
|
|
cd vsix-build
|
|
|
|
|
npx vsce package --no-dependencies
|
|
|
|
|
```
|
|
|
|
|
Creates: `taskr-kanban-1.0.1.vsix`
|
|
|
|
|
|
|
|
|
|
### Alternative: One Command
|
|
|
|
|
```bash
|
|
|
|
|
npm run package && cd vsix-build && npx vsce package --no-dependencies
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 🔄 Keeping Files in Sync
|
|
|
|
|
|
|
|
|
|
### Critical Fields to Sync Between Files
|
|
|
|
|
|
|
|
|
|
When updating extension metadata, ensure these fields match between `package.json` and `package.publish.json`:
|
|
|
|
|
|
|
|
|
|
#### Version & Identity
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"version": "1.0.1", // ⚠️ MUST MATCH
|
|
|
|
|
"publisher": "Hamster", // ⚠️ MUST MATCH
|
|
|
|
|
"displayName": "taskr: Task Master Kanban", // ⚠️ MUST MATCH
|
|
|
|
|
"description": "A visual Kanban board...", // ⚠️ MUST MATCH
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### VS Code Configuration
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"engines": { "vscode": "^1.101.0" }, // ⚠️ MUST MATCH
|
|
|
|
|
"categories": [...], // ⚠️ MUST MATCH
|
|
|
|
|
"activationEvents": [...], // ⚠️ MUST MATCH
|
|
|
|
|
"main": "./dist/extension.js", // ⚠️ MUST MATCH
|
|
|
|
|
"contributes": { ... } // ⚠️ MUST MATCH EXACTLY
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Key Differences (Should NOT Match)
|
|
|
|
|
```json
|
|
|
|
|
// package.json (dev)
|
|
|
|
|
{
|
|
|
|
|
"name": "taskr", // ✅ Short dev name
|
|
|
|
|
"devDependencies": { ... }, // ✅ Only in dev file
|
|
|
|
|
"scripts": { ... } // ✅ Build scripts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// package.publish.json (publishing)
|
|
|
|
|
{
|
|
|
|
|
"name": "taskr-kanban", // ✅ Marketplace name
|
|
|
|
|
"keywords": [...], // ✅ Only in publish file
|
|
|
|
|
"repository": "https://github.com/...", // ✅ Only in publish file
|
|
|
|
|
// NO devDependencies // ✅ Clean for publishing
|
|
|
|
|
// NO build scripts // ✅ Not needed in package
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 🤖 Automated Release Process
|
|
|
|
|
|
|
|
|
|
### Changesets Workflow
|
|
|
|
|
This extension uses [Changesets](https://github.com/changesets/changesets) for automated version management and publishing.
|
|
|
|
|
|
|
|
|
|
#### Adding Changes
|
|
|
|
|
When making changes to the extension:
|
|
|
|
|
|
|
|
|
|
1. **Make your code changes**
|
|
|
|
|
2. **Create a changeset**:
|
|
|
|
|
```bash
|
|
|
|
|
# From project root
|
|
|
|
|
npx changeset add
|
|
|
|
|
```
|
|
|
|
|
3. **Select the extension package**: Choose `taskr-kanban` when prompted
|
|
|
|
|
4. **Select version bump type**:
|
|
|
|
|
- `patch`: Bug fixes, minor updates
|
|
|
|
|
- `minor`: New features, backwards compatible
|
|
|
|
|
- `major`: Breaking changes
|
|
|
|
|
5. **Write a summary**: Describe what changed for users
|
|
|
|
|
|
|
|
|
|
#### Automated Publishing
|
|
|
|
|
The automation workflow runs on pushes to `main`:
|
|
|
|
|
|
|
|
|
|
1. **Version Workflow** (`.github/workflows/version.yml`):
|
|
|
|
|
- Detects when changesets exist
|
|
|
|
|
- Creates a "Version Packages" PR with updated versions and CHANGELOG
|
|
|
|
|
- When the PR is merged, automatically publishes the extension
|
|
|
|
|
|
|
|
|
|
2. **Release Process** (`scripts/release.sh`):
|
|
|
|
|
- Builds the extension using the 3-file packaging system
|
|
|
|
|
- Creates VSIX package
|
|
|
|
|
- Publishes to VS Code Marketplace (if `VSCE_PAT` is set)
|
|
|
|
|
- Publishes to Open VSX Registry (if `OVSX_PAT` is set)
|
|
|
|
|
- Creates git tags for the extension version
|
|
|
|
|
|
|
|
|
|
#### Required Secrets
|
|
|
|
|
For automated publishing, these secrets must be set in the repository:
|
|
|
|
|
|
|
|
|
|
- `VSCE_PAT`: Personal Access Token for VS Code Marketplace
|
|
|
|
|
- `OVSX_PAT`: Personal Access Token for Open VSX Registry
|
|
|
|
|
- `GITHUB_TOKEN`: Automatically provided by GitHub Actions
|
|
|
|
|
|
|
|
|
|
#### Manual Release
|
|
|
|
|
If needed, you can manually trigger a release:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# From project root
|
|
|
|
|
./scripts/release.sh
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Extension Tagging
|
|
|
|
|
The extension uses a separate tagging strategy from the main package:
|
|
|
|
|
|
|
|
|
|
- **Extension tags**: `taskr-kanban@1.0.1`
|
|
|
|
|
- **Main package tags**: `task-master-ai@2.1.0`
|
|
|
|
|
|
|
|
|
|
This allows independent versioning and prevents conflicts in the monorepo.
|
|
|
|
|
|
|
|
|
|
## 🔍 Troubleshooting
|
|
|
|
|
|
|
|
|
|
### Dependency Conflicts
|
|
|
|
|
**Problem**: `vsce package` fails with missing dependencies
|
|
|
|
|
**Solution**: Use the 3-file system - never run `vsce package` from root
|
|
|
|
|
|
|
|
|
|
### Build Failures
|
|
|
|
|
**Problem**: Extension not working after build
|
|
|
|
|
**Check**:
|
|
|
|
|
1. All files copied to `vsix-build/dist/`
|
|
|
|
|
2. `package.publish.json` has correct `main` field
|
|
|
|
|
3. VS Code engine version compatibility
|
|
|
|
|
|
|
|
|
|
### Sync Issues
|
|
|
|
|
**Problem**: Extension works locally but fails when packaged
|
|
|
|
|
**Check**: Ensure critical fields are synced between package files
|
|
|
|
|
|
|
|
|
|
### Changeset Issues
|
|
|
|
|
**Problem**: Version workflow not triggering
|
|
|
|
|
**Check**:
|
|
|
|
|
1. Changeset files exist in `.changeset/`
|
|
|
|
|
2. Package name in changeset matches `package.publish.json`
|
|
|
|
|
3. Changes are pushed to `main` branch
|
|
|
|
|
|
|
|
|
|
**Problem**: Publishing fails
|
|
|
|
|
**Check**:
|
|
|
|
|
1. Required secrets are set in repository settings
|
|
|
|
|
2. `package.publish.json` has correct repository URL
|
|
|
|
|
3. Build process completes successfully
|
|
|
|
|
|
|
|
|
|
## 📝 Version Release Checklist
|
|
|
|
|
|
|
|
|
|
### Manual Releases
|
|
|
|
|
1. **Create changeset**: `npx changeset add`
|
|
|
|
|
2. **Update critical fields** in both `package.json` and `package.publish.json`
|
|
|
|
|
3. **Test locally** with `F5` in VS Code
|
|
|
|
|
4. **Commit and push** to trigger automated workflow
|
|
|
|
|
|
|
|
|
|
### Automated Releases (Recommended)
|
|
|
|
|
1. **Create changeset**: `npx changeset add`
|
|
|
|
|
2. **Push to feature branch** and create PR
|
|
|
|
|
3. **Merge PR** - this triggers version PR creation
|
|
|
|
|
4. **Review and merge version PR** - this triggers automated publishing
|
|
|
|
|
|
|
|
|
|
## 🎯 Why This System?
|
|
|
|
|
|
|
|
|
|
- **Avoids dependency conflicts**: VS Code doesn't see dev dependencies
|
|
|
|
|
- **Clean distribution**: Only essential files in final package
|
|
|
|
|
- **Faster packaging**: No dependency resolution during `vsce package`
|
|
|
|
|
- **Maintainable**: Clear separation of dev vs. production configs
|
|
|
|
|
- **Reliable**: Consistent, conflict-free packaging process
|
|
|
|
|
- **Automated**: Changesets handle versioning and publishing automatically
|
|
|
|
|
- **Traceable**: Clear changelog and git tags for every release
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
**Remember**: Always use `npx changeset add` for changes, then push to trigger automated releases! 🚀
|