[release] prepare v0.34.0 release part 2

8500b029 CHANGELOG.md: update CHANGELOG for v0.34.0
704cd065 src/goEnvironmentStatus.ts: use vscode.env.shell to determine shell type
c31bc21e tools: fix vet errors and add missing copyright headers
58685fcc tools/relnotes: Update gopls and vscode-go release note script
0522373f README.md: use wiki links instead of blob/master/docs
50fd79b3 docs: delete unused pages, move test explorer doc back to src/goTest
5246328d tools/docs2wiki: place source edit link instead of static footer
5659cbce docs/faq.md: entries on formatting issues

Change-Id: I9e8d4ded54dce8184ecc662bf0d6780fd892c133
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 3e85b56..e54406b 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -13,8 +13,8 @@
 - [`#vscode` channel in Gophers Slack](https://invite.slack.golangbridge.org/messages/vscode)
 
 Before filing an issue, please review our troubleshooting guides
-* [Troubleshooting problems with debugging](https://github.com/golang/vscode-go/blob/master/docs/debugging.md#troubleshooting)
-* [Troubleshooting other problems](https://github.com/golang/vscode-go/tree/master/docs/troubleshooting.md)
+* [Troubleshooting problems with debugging](https://github.com/golang/vscode-go/wiki/debugging#troubleshooting)
+* [Troubleshooting other problems](https://github.com/golang/vscode-go/wiki/troubleshooting)
 
 Please answer these questions before submitting your issue. Thanks!
 -->
diff --git a/README.md b/README.md
index 7e18d2d..a96896f 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,9 @@
 [Go programming language](https://golang.org/).
 
 📣
-[Remote attach debugging](docs/debugging.md#connecting-to-headless-delve-with-target-specified-at-server-start-up) is now available via Delve's native DAP implementation with Delve v1.7.3 or newer. It enchances remote debugging with the same
-[debugging features](docs/debugging.md) that are already in use for local debugging. It is now the default with the
-[Go Nightly](docs/nightly.md) build of the extension and will become the default for the stable releases in mid 2022.
+[Remote attach debugging](https://github.com/golang/vscode-go/wiki/debugging#connecting-to-headless-delve-with-target-specified-at-server-start-up) is now available via Delve's native DAP implementation with Delve v1.7.3 or newer. It enchances remote debugging with the same
+[debugging features](https://github.com/golang/vscode-go/wiki/debugging) that are already in use for local debugging. It is now the default with the
+[Go Nightly](https://github.com/golang/vscode-go/wiki/nightly) build of the extension and will become the default for the stable releases in mid 2022.
 We recommend switching your remote attach configurations in `launch.json` to use
 `"debugAdapter":"dlv-dap"` now to verify that this works for you.
 Please [file a new issue](https://github.com/golang/vscode-go/issues/new/choose) if you encounter any problems.
@@ -29,7 +29,7 @@
   * [Go installation guide]. This extension works best with Go 1.14+.
   * [Managing extensions in VS Code].
 * **Step 2.** To activate the extension, open any directory or workspace
-  containing Go code. Once activated, the [Go status bar](docs/ui.md) will
+  containing Go code. Once activated, the [Go status bar](https://github.com/golang/vscode-go/wiki/ui) will
   appear in the bottom left corner of the window and show the recognized Go
   version.
 * **Step 3.** The extension depends on [a set of extra command-line tools](#tools).
@@ -46,7 +46,7 @@
 
 Please be sure to learn more about the many [features](#features) of this
 extension, as well as how to [customize](#customization) them. Take a look at
-[Troubleshooting](docs/troubleshooting.md) and [Help](#ask-for-help) for further
+[Troubleshooting](https://github.com/golang/vscode-go/wiki/troubleshooting) and [Help](#ask-for-help) for further
 guidance.
 
 If you are new to Go, [this article](https://golang.org/doc/code.html) provides
@@ -72,7 +72,7 @@
 commands for working with Go files. You can access any of these by opening the
 Command Palette (`Ctrl+Shift+P` on Linux/Windows and `Cmd+Shift+P` on Mac), and
 then typing in the command name. See the
-[full list of commands](docs/commands.md#detailed-list) provided by this
+[full list of commands](https://github.com/golang/vscode-go/wiki/commands#detailed-list) provided by this
 extension.
 
 <p align=center>
@@ -85,7 +85,7 @@
 
 For better syntax highlighting, we recommend enabling
 [semantic highlighting](https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide)
-by turning on [Gopls' `ui.semanticTokens` setting](https://github.com/golang/vscode-go/blob/master/docs/settings.md#uisemantictokens).
+by turning on [Gopls' `ui.semanticTokens` setting](https://github.com/golang/vscode-go/wiki/settings#uisemantictokens).
     ```
     "gopls": { "ui.semanticTokens": true }
     ```
@@ -94,7 +94,7 @@
 
 The extension uses a few command-line tools developed by the Go community. In
 particular, `go`, `gopls`, and `dlv` **must** be installed for this extension
-to work correctly. See the [tools documentation](docs/tools.md) for a complete
+to work correctly. See the [tools documentation](https://github.com/golang/vscode-go/wiki/tools) for a complete
 list of tools the extension depends on.
 
 In order to locate these command-line tools, the extension searches
@@ -128,16 +128,16 @@
 
 The extension needs no configuration and should work out of the box. However,
 you may wish to adjust settings to customize its behavior. Please see the
-[settings documentation](docs/settings.md) for a comprehensive list of settings.
-See [advanced topics](docs/advanced.md) for further customizations and unique
+[settings documentation](https://github.com/golang/vscode-go/wiki/settings) for a comprehensive list of settings.
+See [advanced topics](https://github.com/golang/vscode-go/wiki/advanced) for further customizations and unique
 use cases.
 
 ## Troubleshooting
 
 If the extension isn't working as you expect, you can take a look at our
 troubleshooting guides. There is one for [general
-troubleshooting](docs/troubleshooting.md), and another specifically for
-[troubleshooting the debugging feature](docs/debugging.md#troubleshooting).
+troubleshooting](https://github.com/golang/vscode-go/wiki/troubleshooting), and another specifically for
+[troubleshooting the debugging feature](https://github.com/golang/vscode-go/wiki/debugging#troubleshooting).
 
 ## Ask for help
 
@@ -154,13 +154,13 @@
 
 If you'd like to get early access to new features and bug fixes, you can use the
 nightly build of this extension. Learn how to install it in by reading the
-[Go Nightly documentation](docs/nightly.md).
+[Go Nightly documentation](https://github.com/golang/vscode-go/wiki/nightly).
 
 ## Contributing
 
 We welcome your contributions and thank you for working to improve the Go
 development experience in VS Code. If you would like to help work on the VS Code
-Go extension, please see our [contribution guide](docs/contributing.md). It
+Go extension, please see our [contribution guide](https://github.com/golang/vscode-go/wiki/contributing). It
 explains how to build and run the extension locally, and describes the process
 of sending a contribution.
 
@@ -181,14 +181,14 @@
 [VS Code Go extension]: https://marketplace.visualstudio.com/items?itemName=golang.go
 [Go installation guide]: https://golang.org/doc/install
 ["Getting started with VS Code Go"]: https://youtu.be/1MXIGYrMk80
-[IntelliSense]: https://github.com/golang/vscode-go/blob/master/docs/features.md#intellisense
-[code navigation]: https://github.com/golang/vscode-go/blob/master/docs/features.md#code-navigation
-[code editing]: https://github.com/golang/vscode-go/blob/master/docs/features.md#code-editing
-[diagnostics]: https://github.com/golang/vscode-go/blob/master/docs/features.md#diagnostics
-[testing]: https://github.com/golang/vscode-go/blob/master/docs/features.md##run-and-test-in-the-editor
-[debugging]: https://github.com/golang/vscode-go/blob/master/docs/debugging.md#features
-[full feature breakdown]: https://github.com/golang/vscode-go/blob/master/docs/features.md
+[IntelliSense]: https://github.com/golang/vscode-go/wiki/features#intellisense
+[code navigation]: https://github.com/golang/vscode-go/wiki/features#code-navigation
+[code editing]: https://github.com/golang/vscode-go/wiki/features#code-editing
+[diagnostics]: https://github.com/golang/vscode-go/wiki/features#diagnostics
+[testing]: https://github.com/golang/vscode-go/wiki/features#run-and-test-in-the-editor
+[debugging]: https://github.com/golang/vscode-go/wiki/debugging#features
+[full feature breakdown]: https://github.com/golang/vscode-go/wiki/features
 [workspace documentation]: https://github.com/golang/tools/blob/master/gopls/doc/workspace.md
-[`Go: Install/Update Tools` command]: https://github.com/golang/vscode-go/blob/master/docs/commands.md#go-installupdate-tools
+[`Go: Install/Update Tools` command]: https://github.com/golang/vscode-go/wiki/commands#go-installupdate-tools
 [documentation about supported workspace layouts]: https://github.com/golang/tools/blob/master/gopls/doc/workspace.md
 [Workspace Folders]: https://code.visualstudio.com/docs/editor/multi-root-workspaces
diff --git a/docs/_Footer.md b/docs/_Footer.md
deleted file mode 100644
index e8b412b..0000000
--- a/docs/_Footer.md
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-### Want to contribute to this Wiki?
-
-Update the source in the [vscode-go project's docs](https://github.com/golang/vscode-go/tree/master/docs) directory, and send a pull request.
diff --git a/docs/_Sidebar.md b/docs/_Sidebar.md
deleted file mode 100644
index d859891..0000000
--- a/docs/_Sidebar.md
+++ /dev/null
@@ -1,21 +0,0 @@
-**For Users**
-* [[features]]
-* [[commands]]
-* [[settings]]
-* [[debugging]]
-* [[tasks]]
-* [[tools]]
-* [[ui]]
-* [[faq]]
-* [[troubleshooting]]
-* [[advanced]]
-* [[nightly]]
-* [[contributing]]
-
-**For Developers**
-* [[release_plan]]
-* [[smoke test]]
-* [[test explorer]]
-* [[debug adapter]]
-* [Go Language Server](https://go.dev/s/gopls)
-* [Delve DAP](https://github.com/go-delve/delve/tree/master/Documentation/api/dap)
diff --git a/docs/debugging.md b/docs/debugging.md
index 2304d3f..bd53164 100644
--- a/docs/debugging.md
+++ b/docs/debugging.md
@@ -6,7 +6,7 @@
 The Go extension has been communicating with Delve through a custom debug adapter program (`legacy` mode).
 As the new [`Delve`'s native debug adapter implementation](https://github.com/go-delve/delve/tree/master/service/dap) has become available (since Delve v1.6.1), the Go extension is transitioning to deprecate the legacy debug adapter in favor of direct communication with Delve via [DAP](https://microsoft.github.io/debug-adapter-protocol/overview).
 
- 📣 **We are happy to announce that the new _`dlv-dap`_ mode of Delve integration is enabled for _local_ _debugging_ by default. For [_remote_ _debugging_](#remote-debugging) it is the default in [Go Nightly](docs/nightly.md) and is
+ 📣 **We are happy to announce that the new _`dlv-dap`_ mode of Delve integration is enabled for _local_ _debugging_ by default. For [_remote_ _debugging_](#remote-debugging) it is the default in [Go Nightly](nightly.md) and is
  available with stable builds on demand with `"debugAdapter": "dlv-dap"` attribute in `launch.json` or `settings.json`!**
 
 Many features and settings described in this document may be available only with the new `dlv-dap` mode.
@@ -39,7 +39,7 @@
 
 Once `dlv` is installed on your system, the extension will prompt you for update whenever installing a newer version is necessary (usually after the Go extension upgrade). You can set the `go.toolsManagement.autoUpdate` setting so the extension can update `dlv` automatically for you.
 
-If you need to install `dlv` manually outside of VS Code (for example, you are building a dev container with necessary tools preinstalled, or install `dlv` built from the tree head), follow the instruction in [Manually installing `dlv`](https://github.com/golang/vscode-go/blob/master/docs/debugging.md#manually-installing-dlv).
+If you need to install `dlv` manually outside of VS Code (for example, you are building a dev container with necessary tools preinstalled, or install `dlv` built from the tree head), follow the instruction in [Manually installing `dlv`](debugging.md#manually-installing-dlv).
 
 💡 The extension used to install a dev version of `dlv` as a separate binary (known as `dlv-dap`). As Delve DAP is stable and the transition work is near completion, from v0.31.0 (to be released in Jan 2022), the extension will switch to use `dlv`, instead of the `dlv-dap` binary. It is safe to delete `dlv-dap` installed on the system after v0.31.0 release.
  
@@ -341,7 +341,7 @@
 
 <p align="center"><img src="images/vscode-go-debug-arch.png" alt="vscode-go debug architecture"> </p>
 
-For information on debugging using the legacy debug adapter, please see the old [Debugging Documentation](https://github.com/golang/vscode-go/blob/master/docs/debugging.md). Note that many new or enhanced features discussed in this document may not be available with the legacy debug adapter.
+For information on debugging using the legacy debug adapter, please see the old [Debugging Documentation](debugging.md). Note that many new or enhanced features discussed in this document may not be available with the legacy debug adapter.
 
 ### Handling STDIN
 
@@ -489,7 +489,7 @@
 
 On rare occasions, you may want to install `dlv` by yourself instead of letting the extension handle its installation.
 
-First, find where the Go extension finds tools. Like [other tools the extension uses](https://github.com/golang/vscode-go/blob/master/docs/tools.md#tools), the Go extension searches the `dlv` executable from `${GOPATH}/bin`, `${GOBIN}` and `${PATH}`  (or `Path` in Windows). So, install `dlv` in the directory. The easiest way to check the tool installation location the Go extension uses is currently by running the `Go: Locate Configured Go Tools` command from the command palette (⇧+⌘+P or Ctrl+Shift+P).
+First, find where the Go extension finds tools. Like [other tools the extension uses](tools.md#tools), the Go extension searches the `dlv` executable from `${GOPATH}/bin`, `${GOBIN}` and `${PATH}`  (or `Path` in Windows). So, install `dlv` in the directory. The easiest way to check the tool installation location the Go extension uses is currently by running the `Go: Locate Configured Go Tools` command from the command palette (⇧+⌘+P or Ctrl+Shift+P).
 
 If your Go version is 1.16 or newer:
 
@@ -529,7 +529,7 @@
 
 The [headless dlv server](https://github.com/go-delve/delve/tree/master/Documentation/api) can now be used with both `"debugAdapter": "legacy"` (default value) and `"debugAdapter": "dlv-dap"` (with Delve v1.7.3 or newer) as well as Delve's [command-line interface](https://github.com/go-delve/delve/tree/master/Documentation/cli) via `dlv connect`. The `--accept-multiclient` flag makes this a multi-use server that persists on `Disconnect` from a client and allows repeated connections from any of the aforementioned clients. A combination of `--accept-multiclient --continue` flags can be used to resume process execution on start-up. Please see `dlv --help` and `dlv [command] --help` for dlv's command-line options.
 
-We encourage you to give the newly added `"debugAdapter": "dlv-dap"` support a try and to [let us know of any issues](https://github.com/golang/vscode-go/issues/new). If you need to use the `legacy` mode, pleasse also see the [legacy remote debugging](https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md#remote-debugging) documentation.
+We encourage you to give the newly added `"debugAdapter": "dlv-dap"` support a try and to [let us know of any issues](https://github.com/golang/vscode-go/issues/new). If you need to use the `legacy` mode, pleasse also see the [legacy remote debugging](debugging-legacy.md#remote-debugging) documentation.
 
 For example, start external headless server:
 ```
@@ -611,9 +611,9 @@
 
 1. Read documentation and [FAQs](#faqs). Also check the [Delve FAQ](https://github.com/go-delve/delve/blob/master/Documentation/faq.md) in case the problem is mentioned there.
 1. Check your `launch.json` configuration. Often error messages appearing in the DEBUG CONSOLE panel reveal issues.
-1. Update Delve (`dlv`) to pick up most recent bug fixes. Follow [the instruction](https://github.com/golang/vscode-go/blob/master/docs/debugging.md#staying-up-to-date).
+1. Update Delve (`dlv`) to pick up most recent bug fixes. Follow [the instruction](debugging.md#staying-up-to-date).
 1. Check if you can reproduce the issue with `dlv`, the command line tool from the integrated terminal. <!-- TODO(vscode-go): add instructions https://github.com/golang/vscode-go/issues/1931 --> If it's reproducible when using `dlv`, take a look at the [Delve project issue tracker](https://github.com/go-delve/delve/issues).
-1. Capture [logs](https://github.com/golang/vscode-go/blob/master/docs/debugging.md#collecting-logs) and inspect them.
+1. Capture [logs](debugging.md#collecting-logs) and inspect them.
 1. Look at the [existing debugging issues](https://github.com/golang/vscode-go/labels/Debug) if similar issues were reported.
 1. If none of these solve your problem, please [open a new issue](#reporting-issues).
 
@@ -651,7 +651,7 @@
 
 ### Debug sessions started with the "debug test" CodeLens or the test UI does not use my `launch.json` configuration.
 
-The "debug test" CodeLens and the [test UI](https://github.com/golang/vscode-go/blob/master/docs/features.md#test-and-benchmark) do not use the `launch.json` configuration ([Issue 855](https://github.com/golang/vscode-go/issues/855)). As a workaround, use the `go.delveConfig` setting and the `go.testFlags` setting. Please note that these all apply to all debug sessions unless overwritten by a specific `launch.json` configuration.
+The "debug test" CodeLens and the [test UI](features.md#test-and-benchmark) do not use the `launch.json` configuration ([Issue 855](https://github.com/golang/vscode-go/issues/855)). As a workaround, use the `go.delveConfig` setting and the `go.testFlags` setting. Please note that these all apply to all debug sessions unless overwritten by a specific `launch.json` configuration.
 
 ### Starting a debug session fails with `decoding dwarf section info at offset 0x0: too short` or `could not open debug info` error.
 
@@ -692,7 +692,7 @@
 
 The core part of Delve DAP implementation is in the [`service/dap`](https://github.com/go-delve/delve/tree/master/service/dap) package. Follow Delve project's [contribution guideline](https://github.com/go-delve/delve/blob/master/CONTRIBUTING.md#contributing-code) to send PRs.
 
-Code for integration with the Go extension is mostly in [`src/goDebugFactory.ts`](https://github.com/golang/vscode-go/blob/master/src/goDebugFactory.ts) and tests are in [`test/integration/goDebug.test.ts`](https://github.com/golang/vscode-go/blob/master/test/integration/goDebug.test.ts). Please take a look at VS Code Go project's [contribution guideline](https://github.com/golang/vscode-go/blob/master/docs/contributing.md) to learn about how to prepare a change and send it for review.
+Code for integration with the Go extension is mostly in [`src/goDebugFactory.ts`](https://github.com/golang/vscode-go/blob/master/src/goDebugFactory.ts) and tests are in [`test/integration/goDebug.test.ts`](https://github.com/golang/vscode-go/blob/master/test/integration/goDebug.test.ts). Please take a look at VS Code Go project's [contribution guideline](contributing.md) to learn about how to prepare a change and send it for review.
 
 ### Testing
 
diff --git a/docs/dlv-dap.md b/docs/dlv-dap.md
deleted file mode 100644
index e2d2667..0000000
--- a/docs/dlv-dap.md
+++ /dev/null
@@ -1,4 +0,0 @@
-The new debug adapter integration using Delve's native DAP implementation
-is enabled by default for local debugging. See
-[Debugging Doc](https://github.com/golang/vscode-go/blob/master/docs/debugging.md)
-for more information.
diff --git a/docs/faq.md b/docs/faq.md
index fb90dfb..85bd464 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -1,3 +1,8 @@
+# Frequently Asked Questions
+
+**NOTE: [Debugging](debugging.md#faqs) has its own FAQ documentation.**
+
+## Syntax highlighting doesn't seem to work.
 
 The default syntax highlighting for Go files is provided by a
 [TextMate rule](https://github.com/jeff-hykin/better-go-syntax) embedded in VS Code,
@@ -5,12 +10,49 @@
 
 For better syntax highlighting (including generics support), we recommend enabling
 [semantic highlighting](https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide)
-by turning on [Gopls' `ui.semanticTokens` setting](https://github.com/golang/vscode-go/blob/master/docs/settings.md#uisemantictokens).
+by turning on [Gopls' `ui.semanticTokens` setting](settings.md#uisemantictokens).
 
 ```json
 "gopls": { "ui.semanticTokens": true }
 ```
 
+## Code formatting by this extension doesn't seem to work.
+
+When you have multiple formatter extensions, be sure to set this
+extension as the default formatter for go language.
+```json5
+"[go]": {
+  "editor.defaultFormatter": "golang.go"
+}
+```
+
+## How can I stop the extension from formatting files on save?
+
+Formatting and organizing imports for Go are enabled by default. This is implemented
+by setting the [language-specific editor settings](https://code.visualstudio.com/docs/getstarted/settings#_languagespecific-editor-settings), that take precedence
+over user/workspace editor settings.
+
+You can choose to disable them by configuring the following settings.
+
+```json5
+"[go]": {
+        "editor.formatOnSave": false,
+        "editor.codeActionsOnSave": {
+            "source.organizeImports": false
+        }
+}
+```
+
+This decision was made a while ago to help users follow the best practice,
+and to detect broken code early (e.g. unused imports causes compile errors in Go).
+Unfortunately, these language-specific editor settings overriden by the
+extension is not easily visible from the settings UI, and confuses users new to Go.
+In the following issues, we are discussing and collecting ideas to improve
+the situation without interrupting existing users.
+
+  * [`editor.formatOnSave` and `editor.codeActionsOnSave`](https://github.com/golang/vscode-go/issues/1815)
+  * [`editor.suggest.snippetsPreventQuickSuggestions`](https://github.com/golang/vscode-go/issues/1805)
+
 <!-- Topics
   * The extension deletes my code on save?
   * Help! The extension does not find 'go'.
diff --git a/docs/features.md b/docs/features.md
index e658933..32601d8 100644
--- a/docs/features.md
+++ b/docs/features.md
@@ -129,9 +129,9 @@
 
 Format code and organize imports, either manually or on save.
 
-The extension formats Go code, organizes imports, and removes unused imports by default. For different behavior, please override per-language default settings following [the instruction](https://github.com/golang/vscode-go/blob/master/docs/advanced.md#formatting-code-and-organizing-imports).
+The extension formats Go code, organizes imports, and removes unused imports by default. For different behavior, please override per-language default settings following [the instruction](advanced.md#formatting-code-and-organizing-imports).
 
-When organizing imports, the imported packages are grouped in the default `goimports` style. In order to group some packages after 3rd-party packages, use [`"gopls": { "formatting.local": <comma-separated imports prefix>}`](https://github.com/golang/vscode-go/blob/master/docs/settings.md#formattinglocal).
+When organizing imports, the imported packages are grouped in the default `goimports` style. In order to group some packages after 3rd-party packages, use [`"gopls": { "formatting.local": <comma-separated imports prefix>}`](settings.md#formattinglocal).
 
 #### Add import
 
diff --git a/docs/release_plan.md b/docs/release_plan.md
deleted file mode 100644
index 013712b..0000000
--- a/docs/release_plan.md
+++ /dev/null
@@ -1,41 +0,0 @@
-Use the following template to create an issue for release.
-
-```
-# Release candidate (DATE)
--   [ ] Announce the release, leave enough time for teams to surface any last minute issues that need to get in before freeze. Make sure debugger and gopls teams are looped in as well.
--   [ ] Create a milestone with the issues that are fixed by this release
--	[ ] Update `master` for the release
-	-	[ ] Update hardcoded latest version for `dlv-dap` and `gopls`
-	-   [ ] Update [`CHANGELOG.md`](https://github.com/golang/vscode-go/blob/master/CHANGELOG.md)
-        -   [ ] Make sure the "Thanks" section is up-to-date
-        -   [ ] Check the Markdown rendering to make sure everything looks good
--   [ ] Update `release` for the release
-    -   [ ] Create a branch against `release` for a pull request
-    -   [ ] Merge changes from `master` to prepare for the release
-    -   [ ] Change the version in [`package.json`](https://github.com/golang/vscode-go/blob/master/package.json) from a `-dev` suffix
-    -   [ ] Run `npm install` to make sure [`package-lock.json`](https://github.com/golang/vscode-go/blob/master/package.json) is up-to-date
-    -   [ ] Update the license file (`$ tools/license.sh; mv LICENSE.prod LICENSE`)
--   [ ] Check the [Long Tests status](https://github.com/golang/vscode-go/actions?query=workflow%3A%22Long+Tests%22)  is green. Otherwise, fix the tests, send cls for review, submit them, and repeat. 
--   [ ] Perform manual [smoke tests]( https://github.com/golang/vscode-go/blob/master/docs/smoke-test.md)
--   [ ] Create new version tag for X.XX.X-rc.1 at gerrit’s vscode-go [repo management page](https://go-review.googlesource.com/admin/repos/vscode-go,tags)
--   [ ] Go to the release page https://github.com/golang/vscode-go/releases and check if the new release candidate is up. If necessary, you can manually edit the comment by clicking the “Edit” button. Don’t mutate uploaded vsix.
--   [ ] Ask editor team and contributors to this release to test the release candidate
-
-# Release Candidate >1 (if necessary)
-- 	[ ] Fix any bugs on `master` and cherry pick changes to `release
--   [ ] Create new version tag for X.XX.X-rc.1 at gerrit’s vscode-go [repo management page](https://go-review.googlesource.com/admin/repos/vscode-go,tags)
--   [ ] Go to the release page https://github.com/golang/vscode-go/releases and check if the new release candidate is up. If necessary, you can manually edit the comment by clicking the “Edit” button. Don’t mutate uploaded vsix.
--   [ ] Ask editor team and contributors to this release to test the release candidate
-
-
-# Final (DATE)
--	[ ] Tag the new release
--	[ ] Update the release description with CHANGELOG contents
--	[ ] Close the milestone
-
-# Prepare for the Next Release
--   [ ] Update `master` post-release
-    -   [ ] Bump the version number to the next monthly ("X.XX.X-dev") release in the `master` branch
-        -   [ ] `package.json`
-        -   [ ] `package-lock.json`
-```
\ No newline at end of file
diff --git a/docs/settings.md b/docs/settings.md
index 1370d64..cdb61ac 100644
--- a/docs/settings.md
+++ b/docs/settings.md
@@ -4,7 +4,7 @@
 
 To navigate to your settings, open the Command Palette (Ctrl+Shift+P or Cmd+Shift+P) and search for "settings". The simplest way to modify your settings is through "Preferences: Open Settings (UI)".
 
-For tuning the features provided by `gopls`, see the [section](https://github.com/golang/vscode-go/blob/master/docs/settings.md#settings-for-gopls) for `gopls` settings.
+For tuning the features provided by `gopls`, see the [section](settings.md#settings-for-gopls) for `gopls` settings.
 
 ## Latest changes
 
diff --git a/docs/tools.md b/docs/tools.md
index bbb3c35..a866e97 100644
--- a/docs/tools.md
+++ b/docs/tools.md
@@ -18,7 +18,7 @@
 ### [`gopls`]
 [`gopls`] is the official Go [language server](https://langserver.org/) developed by the Go team. It is the default backend for most of this extension's IntelliSense, code navigation, code editing, and diagnostics features. When the extension starts, it spawns a `gopls` instance in server mode for each VS Code project.
 
-`gopls` uses the `go` command to analyze your code. The extension automatically propagates necessary settings such as  `"go.buildFlags"`, `"go.buildTags"`, `"go.toolsEnvVars"` and the path to the right `go` command to `gopls`. No extra settings should be necessary, but when you need to adjust `gopls`'s behavior further (e.g., enable more advanced analysis features), please see [all the settings for `gopls`](https://github.com/golang/vscode-go/blob/master/docs/settings.md#settings-for-gopls).
+`gopls` uses the `go` command to analyze your code. The extension automatically propagates necessary settings such as  `"go.buildFlags"`, `"go.buildTags"`, `"go.toolsEnvVars"` and the path to the right `go` command to `gopls`. No extra settings should be necessary, but when you need to adjust `gopls`'s behavior further (e.g., enable more advanced analysis features), please see [all the settings for `gopls`](settings.md#settings-for-gopls).
 
 If you encounter issues with `gopls`, please read the [troubleshooting guide](troubleshooting.md#collect-gopls-information). If you want to run the extension without the language server, you can disable it by setting `"go.useLanguageServer": false`.
 
diff --git a/src/goEnvironmentStatus.ts b/src/goEnvironmentStatus.ts
index c770bb1..7902b84 100644
--- a/src/goEnvironmentStatus.ts
+++ b/src/goEnvironmentStatus.ts
@@ -374,17 +374,13 @@
 
 	// append the goroot to the beginning of the PATH so it takes precedence
 	// TODO: add support for more terminal names
-	// this assumes all non-windows shells are bash-like.
-	if (terminal.name.toLowerCase() === 'cmd') {
-		terminal.sendText(`set PATH=${gorootBin};%Path%`, true);
-		terminal.sendText('cls');
-	} else if (['powershell', 'pwsh'].includes(terminal.name.toLowerCase())) {
+	if (vscode.env.shell.search(/(powershell|pwsh)$/i) !== -1) {
 		terminal.sendText(`$env:Path="${gorootBin};$env:Path"`, true);
 		terminal.sendText('clear');
-	} else if (terminal.name.toLowerCase() === 'fish') {
+	} else if (vscode.env.shell.search(/fish$/i) !== -1) {
 		terminal.sendText(`set -gx PATH ${gorootBin} $PATH`);
 		terminal.sendText('clear');
-	} else if (['bash', 'sh', 'zsh', 'ksh'].includes(terminal.name.toLowerCase())) {
+	} else if (vscode.env.shell.search(/\/(bash|sh|zsh|ksh)$/i) !== -1) {
 		terminal.sendText(`export PATH=${gorootBin}:$PATH`, true);
 		terminal.sendText('clear');
 	}
diff --git a/docs/test-explorer.md b/src/goTest/test-explorer.md
similarity index 100%
rename from docs/test-explorer.md
rename to src/goTest/test-explorer.md
diff --git a/tools/docs2wiki/main.go b/tools/docs2wiki/main.go
index baa41e4..f49ffb4 100644
--- a/tools/docs2wiki/main.go
+++ b/tools/docs2wiki/main.go
@@ -1,3 +1,7 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 //go:build !windows
 // +build !windows
 
@@ -17,6 +21,7 @@
 	"path/filepath"
 	"regexp"
 	"strings"
+	"text/template"
 )
 
 var writeFlag = flag.Bool("w", false, "Overwrite new file contents to disk.")
@@ -28,13 +33,15 @@
 		errorf("Usage: %v <dir>", os.Args[0])
 		os.Exit(1)
 	}
-	if err := rewriteLinks(flag.Arg(0), *writeFlag); err != nil {
+
+	genFooter := footerGenerator("https://github.com/golang/vscode-go/edit/master/docs/")
+	if err := rewriteLinks(flag.Arg(0), genFooter, *writeFlag); err != nil {
 		errorf("failed to rewrite links: %v", err)
 		os.Exit(1)
 	}
 }
 
-func rewriteLinks(dir string, overwrite bool) error {
+func rewriteLinks(dir string, genFooter func(srcPath string) []byte, overwrite bool) error {
 	return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
 		if err != nil {
 			return err
@@ -55,6 +62,10 @@
 		}
 		converted := stripTitleInPage(data)
 		converted = markdownLink2WikiLink(converted)
+		if name != "_Footer.md" && name != "_Sidebar.md" {
+			relPath, _ := filepath.Rel(dir, path)
+			converted = append(converted, genFooter(filepath.ToSlash(relPath))...)
+		}
 		if overwrite {
 			return ioutil.WriteFile(path, converted, 0644)
 		}
@@ -128,3 +139,19 @@
 func errorf(format string, a ...interface{}) {
 	fmt.Fprintf(os.Stderr, format+"\n", a...)
 }
+
+func footerGenerator(sourceEditURL string) func(string) []byte {
+	return func(srcPath string) []byte {
+		editURL := sourceEditURL + srcPath
+		buf := new(bytes.Buffer)
+		footerTmpl.Execute(buf, editURL)
+		return buf.Bytes()
+	}
+}
+
+var footerTmpl = template.Must(template.New("footer").Parse(`
+
+---
+[*✏️ Want to contribute to this wiki?*]({{.}})
+
+Update [the source]({{.}}) and send a PR.`))
diff --git a/tools/docs2wiki/main_test.go b/tools/docs2wiki/main_test.go
index 19b5471..eabb016 100644
--- a/tools/docs2wiki/main_test.go
+++ b/tools/docs2wiki/main_test.go
@@ -8,6 +8,7 @@
 	"io/ioutil"
 	"os"
 	"path/filepath"
+	"strings"
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
@@ -29,7 +30,8 @@
 			// which we will read back for comparison against tt.want.
 			// With overwrite=false, rewriteLinks just prints out the diff
 			// which will be difficult to test.
-			err := rewriteLinks(dir, true)
+			genFooter := func(string) []byte { return nil }
+			err := rewriteLinks(dir, genFooter, true)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -82,3 +84,30 @@
 
 [This doesn't change](https://go.dev/foo.md)
 [Untouchable.md](foo)`
+
+func TestGenFooter(t *testing.T) {
+	const editURLPrefix = "https://source.com/edit/docs/"
+
+	for _, tt := range []struct{ filename, wantURL string }{
+		{filename: "doc.md", wantURL: editURLPrefix + "doc.md"},
+		{filename: "sub/doc.md", wantURL: editURLPrefix + "sub/doc.md"},
+	} {
+		dir := prepareTestData(t, tt.filename, "")
+		defer os.RemoveAll(dir)
+
+		genFooter := footerGenerator(editURLPrefix)
+		err := rewriteLinks(dir, genFooter, true)
+		if err != nil {
+			t.Fatal(err)
+		}
+		// rewriteLinks overwrites the original file,
+		// so reread the content for comparison.
+		got, err := ioutil.ReadFile(filepath.Join(dir, tt.filename))
+		if err != nil {
+			t.Fatal(err)
+		}
+		if !strings.Contains(string(got), tt.wantURL) {
+			t.Errorf("missing %s, got:\n%s", tt.wantURL, got)
+		}
+	}
+}
diff --git a/tools/installtools/main.go b/tools/installtools/main.go
index f33f19e..eaf20a0 100644
--- a/tools/installtools/main.go
+++ b/tools/installtools/main.go
@@ -1,3 +1,7 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 // Binary installtools is a helper that installs Go tools extension tests depend on.
 package main
 
diff --git a/tools/installtools/main_test.go b/tools/installtools/main_test.go
index 99e0961..6175c23 100644
--- a/tools/installtools/main_test.go
+++ b/tools/installtools/main_test.go
@@ -1,3 +1,7 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 // Binary installtools is a helper that installs Go tools extension tests depend on.
 package main
 
diff --git a/tools/relnotes/relnotes.go b/tools/relnotes/relnotes.go
index 98c4450..732de08 100644
--- a/tools/relnotes/relnotes.go
+++ b/tools/relnotes/relnotes.go
@@ -9,10 +9,13 @@
 import (
 	"bytes"
 	"context"
+	"encoding/json"
 	"flag"
 	"fmt"
 	"io/ioutil"
 	"log"
+	"net/http"
+
 	"path/filepath"
 	"regexp"
 	"sort"
@@ -27,17 +30,26 @@
 )
 
 var (
-	milestone  = flag.String("milestone", "", "milestone associated with the release")
-	filterDirs = flag.String("dirs", "", "comma-separated list of directories that should be touched for a CL to be considered relevant")
-	sinceCL    = flag.Int("cl", -1, "the gerrit change number of the first CL to include in the output. Only changes submitted more recently than 'cl' will be included.")
-	project    = flag.String("project", "vscode-go", "name of the golang project")
-	mdMode     = flag.Bool("md", false, "write MD output")
-	exclFile   = flag.String("exclude-from", "", "optional path to changelog MD file. If specified, any 'CL NNNN' occurence in the content will cause that CL to be excluded from this tool's output.")
+	milestone           = flag.String("milestone", "", "milestone associated with the release")
+	filterDirs          = flag.String("dirs", "", "comma-separated list of directories that should be touched for a CL to be considered relevant")
+	sinceCL             = flag.Int("cl", -1, "the gerrit change number of the first CL to include in the output. Only changes submitted more recently than 'cl' will be included.")
+	project             = flag.String("project", "vscode-go", "name of the golang project")
+	exclFile            = flag.String("exclude-from", "", "optional path to changelog MD file. If specified, any 'CL NNNN' occurence in the content will cause that CL to be excluded from this tool's output.")
+	semanticVersion     = flag.String("semver", "", "the semantic version of the new release")
+	githubTokenFilePath = flag.String("token", "", "the absolute path to the github token file")
 )
 
 func main() {
 	flag.Parse()
 
+	if *semanticVersion == "" {
+		log.Fatal("Must provide -semver.")
+	}
+
+	if *githubTokenFilePath == "" {
+		log.Fatal("Must provide -token.")
+	}
+
 	var existingMD []byte
 	if *exclFile != "" {
 		var err error
@@ -86,7 +98,7 @@
 	})
 
 	var changes []*generic.Changelist
-	authors := map[*maintner.GitPerson]bool{}
+	cls := map[*maintner.GerritCL]bool{}
 	ger.ForeachProjectUnsorted(func(gp *maintner.GerritProject) error {
 		if gp.Server() != "go.googlesource.com" || gp.Project() != *project {
 			return nil
@@ -124,34 +136,50 @@
 					return nil
 				}
 			}
-			changes = append(changes, golang.GerritToGenericCL(cl))
-			authors[cl.Owner()] = true
+			if isGoplsChangeList(golang.GerritToGenericCL(cl)) {
+				changes = append(changes, golang.GerritToGenericCL(cl))
+				cls[cl] = true
+			}
 			return nil
 		})
 		return nil
 	})
 
-	sort.Slice(changes, func(i, j int) bool {
-		return changes[i].Number < changes[j].Number
-	})
+	fmt.Printf("# Version: %s\n\n", *semanticVersion)
+	fmt.Printf("## TODO: version - ")
+	now := time.Now()
+	fmt.Printf("%s\n\n", now.Format("2 Jan, 2006"))
+	fmt.Printf("### Changes\n\n")
+	mdPrintChanges(changes, false)
+	fmt.Printf("\n\n")
 
-	if *mdMode {
-		fmt.Printf("## TODO: version - ")
-		now := time.Now()
-		fmt.Printf("%s\n\n", now.Format("2 Jan, 2006"))
-		fmt.Printf("### Changes\n\n")
-		mdPrintChanges(changes, true)
+	fmt.Printf("### Issues\n\n")
+	mdPrintIssues(changes, *milestone)
+	fmt.Printf("\n\n")
 
-		fmt.Printf("### Issues\n\n")
-		mdPrintIssues(changes, *milestone)
+	fmt.Printf("### Release comments\n\n")
+	mdPrintReleaseComments(changes)
+	fmt.Printf("\n\n")
 
-		fmt.Printf("\n### Thanks\n\n")
-		mdPrintContributors(authors)
-	} else {
-		for _, change := range changes {
-			fmt.Printf("  %s\n", change.Subject)
+	fmt.Printf("\n### Thanks\n\n")
+	mdPrintContributors(cls)
+}
+
+func isGoplsChangeList(cl *generic.Changelist) bool {
+	if strings.Contains(cl.Subject, "internal/lsp") || strings.Contains(cl.Subject, "gopls") {
+		return true
+	}
+	for _, issue := range cl.AssociatedIssues {
+		if issue.Repo == "golang/vscode-go" {
+			return true
+		}
+		for _, label := range issue.Labels {
+			if label == "gopls" {
+				return true
+			}
 		}
 	}
+	return false
 }
 
 func mdPrintChanges(changes []*generic.Changelist, byCategory bool) {
@@ -178,7 +206,7 @@
 		}
 		fmt.Printf(" <!-- CL %d -->\n", change.Number)
 	}
-	// Group CLs by category or by number order.
+	// Group CLs by category or by first associated issue number.
 	if byCategory {
 		pkgMap := map[string][]*generic.Changelist{}
 		for _, change := range changes {
@@ -190,7 +218,29 @@
 			}
 		}
 	} else {
-		for _, change := range changes {
+		sort.Slice(changes, func(i, j int) bool {
+			// Sort first by associated issue, then by CL number.
+			var iIssue, jIssue int // first associated issues
+			if len(changes[i].AssociatedIssues) > 0 {
+				iIssue = changes[i].AssociatedIssues[0].Number
+			}
+			if len(changes[j].AssociatedIssues) > 0 {
+				jIssue = changes[j].AssociatedIssues[0].Number
+			}
+			if iIssue != 0 && jIssue != 0 {
+				return iIssue < jIssue // sort CLs with issues first
+			}
+			return iIssue != 0 || changes[i].Number < changes[j].Number
+		})
+
+		currentChange := -1
+		for i, change := range changes {
+			if len(change.AssociatedIssues) > 0 && change.AssociatedIssues[0].Number != currentChange {
+				currentChange = change.AssociatedIssues[0].Number
+				fmt.Printf("CL(s) for issue %d:\n", currentChange)
+			} else if len(change.AssociatedIssues) == 0 && (i == 0 || len(changes[i-1].AssociatedIssues) > 0) {
+				fmt.Printf("CL(s) not associated with any issue:\n")
+			}
 			printChange(change)
 		}
 	}
@@ -212,14 +262,20 @@
 	}
 }
 
-// clPackage returns the package name from the CL's commit message,
-// or "??" if it's formatted unconventionally.
-func clPackage(cl *maintner.GerritCL) string {
-	subj := cl.Subject()
-	if i := strings.Index(subj, ":"); i != -1 {
-		return subj[:i]
+func mdPrintReleaseComments(changes []*generic.Changelist) {
+	type Issue struct {
+		repo   string
+		number int
 	}
-	return "??"
+	printedIssues := make(map[Issue]bool)
+	for _, change := range changes {
+		for _, issue := range change.AssociatedIssues {
+			if _, ok := printedIssues[Issue{issue.Repo, issue.Number}]; !ok {
+				printedIssues[Issue{issue.Repo, issue.Number}] = true
+				printIssueReleaseComment(issue.Repo, issue.Number)
+			}
+		}
+	}
 }
 
 var relNoteRx = regexp.MustCompile(`RELNOTES?=(.+)`)
@@ -243,17 +299,90 @@
 	return ""
 }
 
-func mdPrintContributors(authors map[*maintner.GitPerson]bool) {
-	var names []string
-	for author := range authors {
-		// It would be great to look up the GitHub username by using:
-		// https://pkg.go.dev/golang.org/x/build/internal/gophers#GetPerson.
-		names = append(names, author.Name())
+func mdPrintContributors(cls map[*maintner.GerritCL]bool) {
+	var usernames []string
+	for changelist := range cls {
+		author, err := fetchCLAuthorName(changelist, *project)
+		if err != nil {
+			log.Fatalf("Error fetching Github information for %s: %v\n", changelist.Owner(), err)
+		}
+		usernames = append(usernames, author)
 	}
-	sort.Strings(names)
-	if len(names) > 1 {
-		names[len(names)-1] = "and " + names[len(names)-1]
+	usernames = unique(usernames)
+	if len(usernames) > 1 {
+		usernames[len(usernames)-1] = "and " + usernames[len(usernames)-1]
 	}
 
-	fmt.Printf("Thank you for your contribution, %s!\n", strings.Join(names, ", "))
+	fmt.Printf("Thank you for your contribution, %s!\n", strings.Join(usernames, ", "))
+}
+
+func getURL(url string) ([]byte, error) {
+	req, _ := http.NewRequest("GET", url, nil)
+	if token, err := ioutil.ReadFile(*githubTokenFilePath); err == nil {
+		req.Header.Set("Authorization", "token "+strings.TrimSpace(string(token)))
+	}
+	res, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		log.Fatalf("Error fetching Github information at %s: %v\n", url, err)
+	}
+	return body, nil
+}
+
+func fetchCLAuthorName(changelist *maintner.GerritCL, repo string) (string, error) {
+	githubRepoMapping := map[string]string{
+		"tools":     "golang/tools",
+		"vscode-go": "golang/vscode-go",
+	}
+	body, err := getURL(fmt.Sprintf("https://api.github.com/repos/%s/commits/%s", githubRepoMapping[repo], changelist.Commit.Hash))
+	if err != nil {
+		return "", err
+	}
+	var resp map[string]interface{}
+	if err := json.Unmarshal(body, &resp); err != nil {
+		return "", err
+	}
+	if authorInfo, _ := resp["author"].(map[string]interface{}); authorInfo != nil {
+		if username, ok := authorInfo["login"].(string); ok {
+			return "@" + username, nil
+		}
+	}
+	return changelist.Owner().Name(), nil
+}
+
+// printIssueReleaseComment collects the release comments, which marked by the annotation *Release*, from the issues included in this release.
+func printIssueReleaseComment(repo string, issueNumber int) {
+	body, err := getURL(fmt.Sprintf("https://api.github.com/repos/%s/issues/%d/comments", repo, issueNumber))
+	if err != nil {
+		log.Fatal(err)
+	}
+	var issueComments []interface{}
+	if err := json.Unmarshal(body, &issueComments); err != nil {
+		log.Fatalf("Error fetching Github information for issue %d:\n", issueNumber)
+	}
+	for _, comment := range issueComments {
+		c, _ := comment.(map[string]interface{})
+		if str, ok := c["body"].(string); ok && strings.Contains(str, "*Release*") {
+			fmt.Println(str)
+			return
+		}
+	}
+}
+
+// unique returns a ascendingly sorted set of unique strings among its input
+func unique(input []string) []string {
+	m := make(map[string]bool)
+	for _, entry := range input {
+		m[entry] = true
+	}
+	var list []string
+	for key := range m {
+		list = append(list, key)
+	}
+	sort.Strings(list)
+	return list
 }