Galaxia VS Code Extension
VS Code extension for AI-generated task workflow: receive tasks from the backend, seed them into an approved folder, select files to submit, optionally add commentary, and upload submissions back to the service.
Features
- Sign in with Device Code flow or Personal Access Token (PAT)
- Seed tasks into a user-approved workspace folder with safe path guards
- Submission Picker view: select files, add commentary, preview, and upload
- Quick flow to submit currently open tabs
- Size and type restrictions with configurable allowed globs
- Resilient uploads with progress feedback
Requirements
- VS Code 1.74+
- Node 18+
- Backend running (default:
http://localhost:8000
)
Quick Start
- Install and open the extension workspace.
- Configure the backend URL (optional):
- VS Code Settings → search for "Galaxia" → set
Galaxia › Backend Url
, or add to settings.json:
{
"galaxia.backendUrl": "http://localhost:8000",
"galaxia.allowedGlobs": ["**/*.py", "**/*.ts", "**/*.md"],
"galaxia.includeDirtyTabs": false
}
- Sign in:
- Command Palette → "Galaxia: Sign In (Device Code)". Follow the prompt: your browser opens the verification URL; enter the shown user code. The extension will poll until authorized.
- Alternatively: "Galaxia: Sign In with Token" and paste your PAT.
- Seed a task:
- Command Palette → "Galaxia: Seed Task".
- Select or approve your target folder. Review the dry‑run preview, then confirm to write files atomically.
- Prepare a submission:
- Open the Explorer view → "Galaxia Submissions" tree appears when signed in.
- Select files inside the approved folder. Use:
- "Galaxia: Add Commentary" to attach optional notes
- "Galaxia: Preview Submission" to review manifest
- Upload:
- "Galaxia: Upload Submission" to upload the selection, or
- "Galaxia: Submit Open Tabs" to quickly submit currently open editors
- Verify results: watch status notifications. On success, the server returns a submission id.
Commands
- Galaxia: Sign In (Device Code) —
galaxia.signInDeviceCode
- Galaxia: Sign In with Token —
galaxia.signInWithToken
- Galaxia: Sign Out —
galaxia.signOut
- Galaxia: Seed Task —
galaxia.seedTask
- Galaxia: Open Submission Picker —
galaxia.openSubmissionPicker
- Galaxia: Add Commentary —
galaxia.setSubmissionCommentary
- Galaxia: Preview Submission —
galaxia.previewSubmission
- Galaxia: Upload Submission —
galaxia.uploadSubmission
- Galaxia: Submit Open Tabs —
galaxia.uploadOpenTabs
- Galaxia: Clear Selection —
galaxia.clearSelection
Configuration
galaxia.backendUrl
(string, default http://localhost:8000
): API base URL
galaxia.maxUploadSizeMB
(number, default 100
): maximum upload size
galaxia.allowedGlobs
(string[], default code files & docs): allowed file patterns
galaxia.includeDirtyTabs
(boolean, default false
): include unsaved editors in "Submit Open Tabs"
galaxia.authMethod
("deviceCode" | "token", default deviceCode
)
galaxia.deviceCodePollIntervalSec
(number, default 5
)
galaxia.clientId
(string, default galaxia-vscode
)
galaxia.packThresholdFiles
(number, default 100
)
galaxia.packThresholdMB
(number, default 20
)
Troubleshooting
- Not signed in / actions disabled:
- Check status bar. Run "Galaxia: Sign In (Device Code)" or "Sign In with Token" again.
- Device code expired:
- Re-run "Sign In (Device Code)". Ensure the verification page opens and the user code matches.
- 401 Unauthorized on upload:
- Token may be expired or invalid. Sign in again. Verify
galaxia.backendUrl
points to the correct server.
- Cannot write files / path not allowed:
- Ensure you selected and approved the target folder when seeding. The extension denies writes outside this root.
- Some files missing in picker:
- Update
galaxia.allowedGlobs
to include your patterns. Symlinks are not followed for safety.
- Upload too large:
- Reduce selection or raise
galaxia.maxUploadSizeMB
. Consider excluding large binaries.
- Open tabs not included:
- Enable
galaxia.includeDirtyTabs
or save editors before running "Submit Open Tabs".
- Network errors or timeouts:
- Check backend availability and logs. The client retries with backoff.
Security Notes
- Tokens are stored in VS Code SecretStorage.
- Paths are normalized and constrained to the approved folder to prevent traversal.
- Sensitive values are masked in logs.
Development
- Build:
npm run compile
- Watch:
npm run esbuild-watch
- Tests:
npm test
- Lint:
npm run lint
Contributions welcome. Please ensure changes follow the extension architecture and include tests where appropriate.
Release Operations
Prerequisites
Before publishing to the VS Code Marketplace:
VS Code Extension Packaging Tool (vsce
)
npm install -g @vscode/vsce
License file — Create a LICENSE
file in the extension directory (MIT License recommended)
Repository URL — Update package.json
with your repository:
{
"repository": {
"type": "git",
"url": "https://github.com/YOUR_ORG/galaxia"
}
}
Step 1: Generate Personal Access Token (PAT)
To publish to VS Code Marketplace, you need a Personal Access Token:
Visit Azure DevOps:
Navigate to Personal Access Tokens:
- Click your profile icon (top right)
- Select "Personal access tokens"
Create a new token:
- Click "New Token"
- Name:
vscode-marketplace
(or similar identifier)
- Organization: Select your organization
- Expiration: Set as needed (e.g., 1 year, custom)
- Scopes: Select "Full" (or navigate to find "Marketplace > Manage" if visible)
- Click "Create"
Copy the token immediately — You won't be able to view it again. Save it securely (do not commit to Git).
Step 2: Build the Extension
Prepare the extension for packaging:
# Install dependencies
npm install
# Compile and minify for production
npm run vscode:prepublish
This creates an optimized dist/extension.js
bundle.
Step 3: Package as .vsix
Create a distributable package:
# Package the extension
vsce package
# Optional: Package for specific platform
vsce package --target win32-x64 # Windows x64
vsce package --target linux-x64 # Linux x64
vsce package --target darwin-x64 # macOS Intel
vsce package --target darwin-arm64 # macOS Apple Silicon
This generates a .vsix
file (e.g., galaxia-0.1.0.vsix
) in the current directory.
Step 4: Login to Marketplace
Authenticate with your publisher account:
vsce login galaxia
# When prompted: "Personal Access Token for publisher 'galaxia':"
# Paste your PAT from Step 1
# Expected output: "Logged in as 'galaxia'"
Step 5: Publish to Marketplace
Once authenticated, publish the extension:
# Publish with current version
vsce publish
# Or publish with automatic version bump
vsce publish patch # 0.1.0 → 0.1.1
vsce publish minor # 0.1.0 → 0.2.0
vsce publish major # 0.1.0 → 1.0.0
Note: Microsoft runs a virus scan on each new/updated extension. The extension won't be publicly visible until the scan completes (typically within hours).
Installation for Users
Once published, users can install the extension via:
VS Code Marketplace (Recommended):
- Open VS Code
- Go to Extensions (Ctrl+Shift+X / Cmd+Shift+X)
- Search for "Galaxia"
- Click "Install"
Manual Installation:
- Download the
.vsix
file
- In VS Code: Extensions → "Install from VSIX"
- Select the downloaded file
Command Line:
code --install-extension galaxia-0.1.0.vsix
Maintenance & Updates
Update the extension:
- Make code changes
- Update
package.json
version (e.g., "version": "0.2.0"
)
- Run
npm run vscode:prepublish
- Run
vsce publish
to publish the update
Unpublish (if needed):
# Unpublish a specific version
vsce unpublish galaxia@0.1.0
# Note: Only free extensions can be unpublished; extensions with installs cannot be removed
Troubleshooting
Issue |
Solution |
License warning |
Create a LICENSE file in the extension root directory |
Repository warning |
Add "repository" field to package.json |
Login fails |
Verify your PAT hasn't expired; create a new one and retry |
Publish fails |
Ensure version in package.json is unique; increment if republishing |
Extension not appearing |
Wait for Microsoft's virus scan to complete; check Marketplace after ~1 hour |
Token issues |
Visit https://dev.azure.com/ → Personal access tokens and regenerate if needed |
Contributions welcome. Please ensure changes follow the extension architecture and include tests where appropriate.