Skip to content

Commit 707cbcb

Browse files
committed
feat: initial implementation of LaunchyBar extension
A narrow icon launcher bar for Visual Studio 2022/2026, similar to VS Code's Activity Bar. Features include: - Tool window with customizable icon buttons - Launch external programs, toggle tool windows, or execute VS commands - Configuration persisted to JSON in AppData - VS theme integration with native appearance - Options page for customization - Telemetry via Otel4Vsix
0 parents  commit 707cbcb

36 files changed

Lines changed: 1585 additions & 0 deletions

.commitlintrc.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
extends:
2+
- "@commitlint/config-conventional"
3+
rules:
4+
type-enum:
5+
- 2
6+
- always
7+
- - feat
8+
- fix
9+
- docs
10+
- style
11+
- refactor
12+
- perf
13+
- test
14+
- build
15+
- ci
16+
- chore
17+
- revert
18+
scope-case:
19+
- 2
20+
- always
21+
- lower-case
22+
subject-case:
23+
- 2
24+
- never
25+
- - sentence-case
26+
- start-case
27+
- pascal-case
28+
- upper-case
29+
subject-full-stop:
30+
- 2
31+
- never
32+
- "."
33+
header-max-length:
34+
- 2
35+
- always
36+
- 100

.editorconfig

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# EditorConfig is awesome: https://editorconfig.org
2+
root = true
3+
4+
[*]
5+
indent_style = space
6+
indent_size = 4
7+
end_of_line = crlf
8+
charset = utf-8
9+
trim_trailing_whitespace = true
10+
insert_final_newline = true
11+
12+
[*.{json,yml,yaml}]
13+
indent_size = 2
14+
15+
[*.md]
16+
trim_trailing_whitespace = false
17+
18+
[*.{csproj,props,targets,vsixmanifest,vsct}]
19+
indent_size = 2
20+
21+
[*.xaml]
22+
indent_size = 2

.github/workflows/publish.yml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
name: Publish
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
branches:
9+
- main
10+
workflow_dispatch:
11+
12+
jobs:
13+
build:
14+
runs-on: windows-latest
15+
16+
env:
17+
SolutionPath: src/CodingWithCalvin.LaunchyBar.slnx
18+
VsixPath: src/CodingWithCalvin.LaunchyBar/bin/Release/CodingWithCalvin.LaunchyBar.vsix
19+
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
24+
- name: Setup .NET
25+
uses: actions/setup-dotnet@v4
26+
with:
27+
dotnet-version: 8.0.x
28+
29+
- name: Setup MSBuild
30+
uses: microsoft/setup-msbuild@v2
31+
32+
- name: Restore NuGet packages
33+
run: dotnet restore ${{ env.SolutionPath }}
34+
35+
- name: Build
36+
run: dotnet build ${{ env.SolutionPath }} --configuration Release --no-restore
37+
38+
- name: Upload VSIX artifact
39+
uses: actions/upload-artifact@v4
40+
with:
41+
name: vsix
42+
path: ${{ env.VsixPath }}
43+
44+
publish:
45+
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
46+
needs: build
47+
runs-on: windows-latest
48+
49+
steps:
50+
- name: Download VSIX artifact
51+
uses: actions/download-artifact@v4
52+
with:
53+
name: vsix
54+
55+
- name: Publish to VS Marketplace
56+
uses: cezarypiatek/VssExtensionPublishAction@v1
57+
with:
58+
vsix-file: CodingWithCalvin.LaunchyBar.vsix
59+
publish-manifest-file: ${{ github.workspace }}/vs-publish.json
60+
personal-access-token: ${{ secrets.VS_MARKETPLACE_PAT }}

.gitignore

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Build results
2+
[Dd]ebug/
3+
[Rr]elease/
4+
x64/
5+
x86/
6+
[Aa][Rr][Mm]/
7+
[Aa][Rr][Mm]64/
8+
bld/
9+
[Bb]in/
10+
[Oo]bj/
11+
[Ll]og/
12+
[Ll]ogs/
13+
14+
# Generated code (VsixSdk)
15+
Generated/
16+
17+
# Visual Studio
18+
.vs/
19+
*.suo
20+
*.user
21+
*.userosscache
22+
*.sln.docstates
23+
*.rsuser
24+
*.userprefs
25+
*.dbmdl
26+
*.jfm
27+
28+
# VSIX
29+
*.vsix
30+
31+
# NuGet
32+
*.nupkg
33+
*.snupkg
34+
**/[Pp]ackages/*
35+
!**/[Pp]ackages/build/
36+
*.nuget.props
37+
*.nuget.targets
38+
39+
# Test Results
40+
[Tt]est[Rr]esult*/
41+
[Bb]uild[Ll]og.*
42+
TestResult.xml
43+
44+
# JetBrains Rider
45+
.idea/
46+
*.sln.iml
47+
48+
# Resharper
49+
_ReSharper*/
50+
*.[Rr]e[Ss]harper
51+
*.DotSettings.user
52+
53+
# Windows
54+
[Tt]humbs.db
55+
ehthumbs.db
56+
Desktop.ini
57+
58+
# macOS
59+
.DS_Store
60+
.AppleDouble
61+
.LSOverride
62+
63+
# Node.js (for husky)
64+
node_modules/

.husky/commit-msg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
npx --no -- commitlint --edit $1

CLAUDE.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# CLAUDE.md
2+
3+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4+
5+
## Critical Rules
6+
7+
These rules override all other instructions:
8+
1. **NEVER commit directly to main** - Always create a feature branch and submit a pull request
9+
2. **Conventional commits** - Format: `type(scope): description`
10+
3. **GitHub Issues for TODOs** - Use `gh` CLI to manage issues, no local TODO files. Use conventional commit format for issue titles
11+
4. **Pull Request titles** - Use conventional commit format (same as commits)
12+
5. **Branch naming** - Use format: `type/scope/short-description` (e.g., `feat/ui/add-context-menu`)
13+
6. **Working an issue** - Always create a new branch from an updated main branch
14+
7. **Check branch status before pushing** - Verify the remote tracking branch still exists. If a PR was merged/deleted, create a new branch from main instead
15+
8. **No co-authors** - Do not add co-author information on commits or pull requests
16+
9. **No "generated by" statements** - Do not add generated-by statements on pull requests
17+
18+
## Overview
19+
20+
VS-LaunchyBar is a Visual Studio 2022/2026 extension that provides a narrow icon launcher bar similar to VS Code's Activity Bar or JetBrains' side bars.
21+
22+
## Technology Stack
23+
24+
- **Framework**: .NET Framework 4.8
25+
- **SDK**: CodingWithCalvin.VsixSdk 0.4.0
26+
- **Toolkit**: Community.VisualStudio.Toolkit.17
27+
- **Telemetry**: CodingWithCalvin.Otel4Vsix
28+
- **UI**: WPF with VS theme integration
29+
- **Configuration**: JSON (System.Text.Json)
30+
31+
## Project Structure
32+
33+
```
34+
VS-LaunchyBar/
35+
├── .github/workflows/ # CI/CD pipeline
36+
├── resources/ # Icons and images (linked into project)
37+
├── src/
38+
│ └── CodingWithCalvin.LaunchyBar/
39+
│ ├── Commands/ # VS command handlers
40+
│ ├── Models/ # Data models (LaunchItem, Configuration)
41+
│ ├── Options/ # Tools > Options page
42+
│ ├── Services/ # Configuration and Launch services
43+
│ ├── ToolWindow/ # Tool window UI (XAML + code-behind)
44+
│ ├── ViewModels/ # MVVM ViewModels
45+
│ └── Themes/ # WPF styles for VS integration
46+
└── README.md
47+
```
48+
49+
## Build Commands
50+
51+
```powershell
52+
# Build
53+
dotnet build src/CodingWithCalvin.LaunchyBar.slnx
54+
55+
# Build Release
56+
dotnet build src/CodingWithCalvin.LaunchyBar.slnx --configuration Release
57+
58+
# Restore packages
59+
dotnet restore src/CodingWithCalvin.LaunchyBar.slnx
60+
```
61+
62+
## Key Components
63+
64+
### LaunchyBarPackage.cs
65+
Main VS package entry point. Registers tool window, commands, and options page.
66+
67+
### LaunchItem.cs
68+
Represents a single item in the bar with properties for:
69+
- `Type`: ExternalProgram, ToolWindow, VsCommand, CustomAction
70+
- `Target`: Path, command ID, or GUID depending on type
71+
- `Position`: Top or Bottom of bar
72+
73+
### ConfigurationService.cs
74+
Persists configuration to `%LOCALAPPDATA%\CodingWithCalvin\LaunchyBar\config.json`
75+
76+
### LaunchService.cs
77+
Executes actions: launches external programs, toggles tool windows, or executes VS commands.
78+
79+
## VS Integration
80+
81+
- Tool window docks to left side, linked to Solution Explorer
82+
- Auto-loads on VS startup (no solution required)
83+
- Uses VS theme brushes for native appearance
84+
- Uses KnownMonikers for icons
85+
86+
## Testing
87+
88+
Debug by pressing F5 in Visual Studio to launch experimental instance.
89+
90+
## Resources
91+
92+
Resources are stored in root `/resources/` folder and linked into the project via csproj `<Content>` items with `Link` attribute.

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2025 Coding With Calvin / Calvin A. Allen
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

0 commit comments

Comments
 (0)