{"id":35273159,"url":"https://github.com/nullvariant/nullvariant-vscode-extensions","last_synced_at":"2026-03-15T08:55:41.772Z","repository":{"id":328087153,"uuid":"1114178353","full_name":"nullvariant/nullvariant-vscode-extensions","owner":"nullvariant","description":"VS Code extensions monorepo - includes git-id-switcher for managing multiple Git identities","archived":false,"fork":false,"pushed_at":"2026-02-06T17:26:13.000Z","size":7545,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-07T01:57:08.143Z","etag":null,"topics":["account-switcher","git-config","git-identity","gpg-key","i18n","identity-management","multi-account","open-source","profile-switcher","ssh-key","submodule","visual-studio-code","visual-studio-code-extension","vscode","vscode-extension"],"latest_commit_sha":null,"homepage":"https://github.com/nullvariant/nullvariant-vscode-extensions","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nullvariant.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"buy_me_a_coffee":"nullvariant"}},"created_at":"2025-12-11T02:30:06.000Z","updated_at":"2026-02-06T17:26:01.000Z","dependencies_parsed_at":"2026-01-06T02:03:17.496Z","dependency_job_id":null,"html_url":"https://github.com/nullvariant/nullvariant-vscode-extensions","commit_stats":null,"previous_names":["nullvariant/nullvariant-vscode-extensions"],"tags_count":124,"template":false,"template_full_name":null,"purl":"pkg:github/nullvariant/nullvariant-vscode-extensions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nullvariant%2Fnullvariant-vscode-extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nullvariant%2Fnullvariant-vscode-extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nullvariant%2Fnullvariant-vscode-extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nullvariant%2Fnullvariant-vscode-extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nullvariant","download_url":"https://codeload.github.com/nullvariant/nullvariant-vscode-extensions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nullvariant%2Fnullvariant-vscode-extensions/sbom","scorecard":{"id":1241814,"data":{"date":"2026-01-16T06:37:30Z","repo":{"name":"github.com/nullvariant/nullvariant-vscode-extensions","commit":"1019f1e7fbfc1429360f4a0ba93caf49a0a65912"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":7.2,"checks":[{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1","Info: detected update tool: RenovateBot: renovate.json:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/auto-tag.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/blaze-bot.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/bot-monitoring.yml:29","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/bot-monitoring.yml:30","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:17","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:70","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ciel-bot.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/deploy-docs.yml:23","Info: jobLevel 'contents' permission set to 'read': .github/workflows/generate-readme.yml:20","Info: jobLevel 'contents' permission set to 'read': .github/workflows/justice-bot.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/luna-bot.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/mimi-bot.yml:21","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish.yml:17","Info: jobLevel 'contents' permission set to 'read': .github/workflows/restyled.yml:14","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security.yml:24","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security.yml:59","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security.yml:106","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security.yml:143","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security.yml:142","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security.yml:175","Info: jobLevel 'contents' permission set to 'read': .github/workflows/slow-bot.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/unpublish.yml:23","Info: found token with 'none' permissions: .github/workflows/auto-tag.yml:1","Info: found token with 'none' permissions: .github/workflows/blaze-bot.yml:1","Info: found token with 'none' permissions: .github/workflows/bot-monitoring.yml:1","Info: found token with 'none' permissions: .github/workflows/ci.yml:1","Info: found token with 'none' permissions: .github/workflows/ciel-bot.yml:1","Info: found token with 'none' permissions: .github/workflows/deploy-docs.yml:1","Info: found token with 'none' permissions: .github/workflows/generate-readme.yml:1","Info: found token with 'none' permissions: .github/workflows/justice-bot.yml:1","Info: found token with 'none' permissions: .github/workflows/luna-bot.yml:1","Info: found token with 'none' permissions: .github/workflows/mimi-bot.yml:1","Info: found token with 'none' permissions: .github/workflows/publish.yml:1","Info: found token with 'none' permissions: .github/workflows/restyled.yml:1","Info: found token with 'none' permissions: .github/workflows/security.yml:1","Info: found token with 'none' permissions: .github/workflows/slow-bot.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/sonarcloud.yml:13","Info: found token with 'none' permissions: .github/workflows/unpublish.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  39 out of  39 GitHub-owned GitHubAction dependencies pinned","Info:  39 out of  39 third-party GitHubAction dependencies pinned","Info:   9 out of   9 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":5,"reason":"badge detected: Passing","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":10,"reason":"5 out of the last 5 releases have a total of 5 signed artifacts.","details":["Info: provenance for release artifact: git-id-switcher-0.12.3.vsix.intoto.jsonl: https://github.com/nullvariant/nullvariant-vscode-extensions/releases/tag/git-id-switcher-v0.12.3","Info: provenance for release artifact: git-id-switcher-0.12.2.vsix.intoto.jsonl: https://github.com/nullvariant/nullvariant-vscode-extensions/releases/tag/git-id-switcher-v0.12.2","Info: provenance for release artifact: git-id-switcher-0.12.0.vsix.intoto.jsonl: https://github.com/nullvariant/nullvariant-vscode-extensions/releases/tag/git-id-switcher-v0.12.0","Info: provenance for release artifact: git-id-switcher-0.11.3.vsix.intoto.jsonl: https://github.com/nullvariant/nullvariant-vscode-extensions/releases/tag/git-id-switcher-v0.11.3","Info: provenance for release artifact: git-id-switcher-0.11.2.vsix.intoto.jsonl: https://github.com/nullvariant/nullvariant-vscode-extensions/releases/tag/git-id-switcher-v0.11.2"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-g9mf-h72j-4rw9"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: nullvariant-zoo"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"30 out of 30 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2026-01-16T23:52:02.069Z","repository_id":328087153,"created_at":"2026-01-16T23:52:02.069Z","updated_at":"2026-01-16T23:52:02.069Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29369417,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["account-switcher","git-config","git-identity","gpg-key","i18n","identity-management","multi-account","open-source","profile-switcher","ssh-key","submodule","visual-studio-code","visual-studio-code-extension","vscode","vscode-extension"],"created_at":"2025-12-30T13:02:19.093Z","updated_at":"2026-03-15T08:55:41.762Z","avatar_url":"https://github.com/nullvariant.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/nullvariant"],"categories":[],"sub_categories":[],"readme":"# nullvariant-vscode-extensions\n\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/nullvariant/nullvariant-vscode-extensions/badge)](https://securityscorecards.dev/viewer/?uri=github.com/nullvariant/nullvariant-vscode-extensions)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11709/badge)](https://www.bestpractices.dev/projects/11709)\n[![SLSA 3](https://slsa.dev/images/gh-badge-level3.svg)](https://slsa.dev/)\n[![Security](https://github.com/nullvariant/nullvariant-vscode-extensions/actions/workflows/security.yml/badge.svg)](https://github.com/nullvariant/nullvariant-vscode-extensions/actions/workflows/security.yml)\n[![CI](https://github.com/nullvariant/nullvariant-vscode-extensions/actions/workflows/ci.yml/badge.svg)](https://github.com/nullvariant/nullvariant-vscode-extensions/actions/workflows/ci.yml)\n[![Platform](https://img.shields.io/badge/%20-Win%20%7C%20Mac%20%7C%20Linux-blue?labelColor=555\u0026logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0yMSAySDNjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YySDh2Mmg4di0yaC0ydi0yaDdjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptMCAxNEgzVjRoMTh2MTJ6Ii8+PC9zdmc+)](https://github.com/nullvariant/nullvariant-vscode-extensions/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/nullvariant/nullvariant-vscode-extensions/graph/badge.svg)](https://codecov.io/gh/nullvariant/nullvariant-vscode-extensions)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=nullvariant_nullvariant-vscode-extensions\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=nullvariant_nullvariant-vscode-extensions)\n[![Harden-Runner](https://img.shields.io/badge/Harden--Runner-enabled-7037F5)](https://github.com/step-security/harden-runner)\n\nVS Code extensions by [Null;Variant](https://github.com/nullvariant).\n\n## Extensions\n\n### Git ID Switcher\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" valign=\"top\" width=\"150\"\u003e\n      \u003cimg src=\"https://assets.nullvariant.com/nullvariant-vscode-extensions/extensions/git-id-switcher/images/icon.png\" width=\"128\" alt=\"Git ID Switcher\"\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      Switch between multiple Git identities with one click. Manage multiple GitHub accounts, SSH keys, GPG signing, and \u003cb\u003eautomatically apply identity to Git Submodules\u003c/b\u003e.\n      \u003cbr\u003e\u003cbr\u003e\n      \u003ca href=\"https://marketplace.visualstudio.com/items?itemName=nullvariant.git-id-switcher\"\u003e\u003cimg src=\"https://img.shields.io/visual-studio-marketplace/v/nullvariant.git-id-switcher\" alt=\"VS Code Marketplace\"\u003e\u003c/a\u003e\n      \u003ca href=\"https://open-vsx.org/extension/nullvariant/git-id-switcher\"\u003e\u003cimg src=\"https://img.shields.io/open-vsx/v/nullvariant/git-id-switcher\" alt=\"Open VSX Registry\"\u003e\u003c/a\u003e\n      \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n      \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/DESIGN_PHILOSOPHY.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/🪨_Karesansui-Architecture-4a5568\" alt=\"Karesansui Architecture\"\u003e\u003c/a\u003e\n      \u003cbr\u003e\n      \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/LANGUAGES.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/🌐_Languages-17+9_more-blue\" alt=\"26 Languages\"\u003e\u003c/a\u003e \u003cb\u003e🇺🇸\u003c/b\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/ja/README.md\"\u003e🇯🇵\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/zh-CN/README.md\"\u003e🇨🇳\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/zh-TW/README.md\"\u003e🇹🇼\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/ko/README.md\"\u003e🇰🇷\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/de/README.md\"\u003e🇩🇪\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/fr/README.md\"\u003e🇫🇷\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/es/README.md\"\u003e🇪🇸\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/pt-BR/README.md\"\u003e🇧🇷\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/it/README.md\"\u003e🇮🇹\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/ru/README.md\"\u003e🇷🇺\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/pl/README.md\"\u003e🇵🇱\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/tr/README.md\"\u003e🇹🇷\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/cs/README.md\"\u003e🇨🇿\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/hu/README.md\"\u003e🇭🇺\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/bg/README.md\"\u003e🇧🇬\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/uk/README.md\"\u003e🇺🇦\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/eo/README.md\"\u003e🌍\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/haw/README.md\"\u003e🌺\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/ain/README.md\"\u003e🐻\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/ryu/README.md\"\u003e🐉\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/tok/README.md\"\u003e✨\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/tlh/README.md\"\u003e🖖\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/x-lolcat/README.md\"\u003e🐱\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/x-pirate/README.md\"\u003e🏴‍☠️\u003c/a\u003e \u003ca href=\"https://github.com/nullvariant/nullvariant-vscode-extensions/blob/main/extensions/git-id-switcher/docs/i18n/x-shakespeare/README.md\"\u003e🎭\u003c/a\u003e\n      \u003cbr\u003e\u003cbr\u003e\n      \u003ca href=\"extensions/git-id-switcher/#readme\"\u003e📖 Documentation\u003c/a\u003e | \u003ca href=\"extensions/git-id-switcher/docs/CONTRIBUTING.md\"\u003e🤝 Contributing\u003c/a\u003e | \u003ca href=\"https://marketplace.visualstudio.com/items?itemName=nullvariant.git-id-switcher\"\u003e📦 Marketplace\u003c/a\u003e | \u003ca href=\"https://open-vsx.org/extension/nullvariant/git-id-switcher\"\u003e📦 Open VSX\u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"https://assets.nullvariant.com/nullvariant-vscode-extensions/extensions/git-id-switcher/images/demo.png\" width=\"600\" alt=\"Git ID Switcher Demo\"\u003e\n\n## Quick Start for Developers\n\nGet started in 5 steps:\n\n```bash\n# 1. Clone\ngit clone https://github.com/nullvariant/nullvariant-vscode-extensions.git\ncd nullvariant-vscode-extensions\n\n# 2. Install dependencies (from repository root)\nnpm install\n\n# 3. Compile\nnpm run compile:all\n\n# 4. Run tests\nnpm run test:all\n\n# 5. Start watch mode for development\nnpm run watch:all\n```\n\nFor linting: `npm run lint:all`\n\n## Extension Initialization Flow\n\n```mermaid\nflowchart TD\n    A[Extension Activated] --\u003e B{Workspace Trusted?}\n    B --\u003e|No| C[Restricted Mode]\n    B --\u003e|Yes| D[initializeState]\n    D --\u003e E{Saved Identity?}\n    E --\u003e|Yes| I[Apply Identity]\n    E --\u003e|No| F{Detect from Git Config?}\n    F --\u003e|Yes| I\n    F --\u003e|No| G{Detect from SSH Agent?}\n    G --\u003e|Yes| I\n    G --\u003e|No| H[No Identity]\n    I --\u003e J[Update Status Bar]\n    H --\u003e J\n    J --\u003e K[Ready]\n```\n\n## Development\n\n### Prerequisites\n\n- Node.js 20+\n\n### Working on an extension\n\n```bash\ncd extensions/git-id-switcher\n\n# Install dependencies\nnpm install\n\n# Compile\nnpm run compile\n\n# Watch mode\nnpm run watch\n\n# Package as VSIX\nnpm run package\n```\n\n### Testing locally\n\n#### Manual Testing\n\n1. Open the extension folder in VS Code\n2. Press `F5` to launch Extension Development Host\n3. Test the extension in the new window\n\n#### Unit Tests\n\n```bash\ncd extensions/git-id-switcher\nnpm run test\n```\n\n#### E2E Tests\n\nE2E tests run in an actual VS Code environment using `@vscode/test-electron`:\n\n```bash\ncd extensions/git-id-switcher\nnpm run test:e2e\n```\n\n\u003e **Note**: On first run, VS Code will be downloaded automatically (~100MB). Subsequent runs use the cached version.\n\n### Git Hooks Setup\n\nThis repository uses custom git hooks for release safety. After cloning, run:\n\n```bash\ngit config core.hooksPath .githooks\n```\n\nThis enables the pre-push hook that prevents pushing version bumps without release tags.\n\n## Repository Structure\n\n```\nnullvariant-vscode-extensions/\n├── extensions/\n│   └── git-id-switcher/\n├── .github/workflows/\n│   ├── ci.yml\n│   └── publish.yml\n├── .githooks/\n│   └── pre-push\n├── LICENSE\n└── README.md\n```\n\n## Publishing (Maintainers Only)\n\n\u003e **Note**: The `main` branch is protected. All changes must go through a Pull Request.\n\nExtensions are automatically published when a release tag is pushed:\n\n1. Ensure all changes are merged to `main` via Pull Request\n2. Create and push a release tag from the latest `main`:\n\n```bash\ngit checkout main\ngit pull origin main\ngit tag git-id-switcher-v1.0.0\ngit push origin git-id-switcher-v1.0.0\n```\n\nThe [publish workflow](.github/workflows/publish.yml) will automatically build and publish the extension to VS Code Marketplace and Open VSX.\n\n## Supply Chain Security\n\nEvery release includes cryptographic verification artifacts:\n\n| Artifact              | Description                         |\n| --------------------- | ----------------------------------- |\n| `*.vsix`              | The extension package               |\n| `*.vsix.intoto.jsonl` | SLSA Level 3 build provenance       |\n| `*.vsix.bundle`       | Cosign keyless signature (Sigstore) |\n| `sbom-cyclonedx.json` | CycloneDX SBOM with attestation     |\n\n### Verify VSIX signature (Cosign)\n\n```bash\n# Download the VSIX and its .bundle from the GitHub Release, then:\ncosign verify-blob git-id-switcher-\u003cversion\u003e.vsix \\\n  --bundle git-id-switcher-\u003cversion\u003e.vsix.bundle \\\n  --certificate-identity-regexp=\"https://github.com/nullvariant/nullvariant-vscode-extensions/\" \\\n  --certificate-oidc-issuer=\"https://token.actions.githubusercontent.com\"\n```\n\n### Verify SLSA provenance (GitHub CLI)\n\n```bash\ngh attestation verify git-id-switcher-\u003cversion\u003e.vsix \\\n  --repo nullvariant/nullvariant-vscode-extensions\n```\n\n### Verify SBOM attestation (GitHub CLI)\n\n```bash\ngh attestation verify git-id-switcher-\u003cversion\u003e.vsix \\\n  --repo nullvariant/nullvariant-vscode-extensions \\\n  --predicate-type https://cyclonedx.org/bom\n```\n\n## Extension Fingerprint\n\nUse this information to verify you have the authentic Git ID Switcher extension:\n\n| Field        | Value                                                                             |\n| ------------ | --------------------------------------------------------------------------------- |\n| Publisher    | `nullvariant`                                                                     |\n| Extension ID | `nullvariant.git-id-switcher`                                                     |\n| Repository   | `https://github.com/nullvariant/nullvariant-vscode-extensions`                    |\n| Marketplace  | `https://marketplace.visualstudio.com/items?itemName=nullvariant.git-id-switcher` |\n| Open VSX     | `https://open-vsx.org/extension/nullvariant/git-id-switcher`                      |\n\nIf you find an extension with a similar name from a different publisher, please report it (see [SECURITY.md](SECURITY.md#reporting-typosquatting)).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnullvariant%2Fnullvariant-vscode-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnullvariant%2Fnullvariant-vscode-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnullvariant%2Fnullvariant-vscode-extensions/lists"}