@Joseph Griffen 
ZWrite is going to output the internal format of the %Status value, which isn't that easy to parse visually. $SYSTEM.Status.DisplayError() will output the status text to the current device in a more readable format.

USER>Write ##class(%Atelier.v1.Utils.General).ValidateDocName("project.prj",.sc)
0
USER>ZWrite sc
sc="0 "_$lb($lb(16006,"project.prj",,,,,,,,$lb(,"USER",$lb("e^ValidateDocName+33^%apiSRC^2","e^ValidateDocName+1^%Atelier.v1.Utils.General.1^1","e^^^0"))))/* ERROR #16006: Document 'project.prj' name is invalid [ValidateDocName+33^%apiSRC:USER] */

USER>Do $SYSTEM.Status.DisplayError(sc)

ERROR #16006: Document 'project.prj' name is invalid [ValidateDocName+33^%apiSRC:USER]

If you need to store the status text in a variable you can use $SYSTEM.Status.GetErrorText().

I just created a code-workspace file using your example above and I couldn't reproduce this is it possible that there's a .vscode/settings.json inside the "." folder that contains different objectscript.export settings? If so, those will take precedence. Folder-specific settings take precedence over workspace-specific settings, and workspace-specific take precdence over user-specific.

@Mathew Rimmington 
I think I've made the fix. You can download a version of the Language Server extension with the fix here. To install it, simply drag the .vsix file into the extensions view in VS Code. It will prompt you to reload so the new version of the extension can be activated. Be sure you download the correct version for your platform and please let me know if your issue is resolved. I plan on releasing a new Language Server version very soon and I'd like this fix to be in it!

@Mathew Rimmington 
Sorry, I misread the prompt in the screenshot. Can you open the settings.json file that contains the server definition that you're having trouble with and send me that? I'd like to confirm that it has "UnknownUser" as the username and not no username. If so, I can modify the Language Server to handle that case better.

I know what's happening now. You're creating the server definition with no username, and when the server manager extension tries to use it, it assumes that you wanted to store your credentials securely, so it gives you this prompt. When you leave it blank, it inserts "UnknownUser" with no password as your credentials. The Language Server extension needs to handle that case. I will make the fix.

@Stephane Devin 
Here's a pretty-printed version of the attributes list for JavaScript:

Attribute 0: Error
Attribute 1: White Space
Attribute 2: _Tab
Attribute 3: Label
Attribute 4: Delimiter
Attribute 5: String
Attribute 6: Comment
Attribute 7: Decimal integer
Attribute 8: Hexadecimal integer
Attribute 9: Floating point number
Attribute 10: Regexp delimiter
Attribute 11: Regexp body
Attribute 12: Regexp escape sequence
Attribute 13: Regexp flags
Attribute 14: Identifier
Attribute 15: Operator
Attribute 16: Definition keyword
Attribute 17: Statement keyword
Attribute 18: Literal keyword
Attribute 19: Expression keyword
Attribute 20: Future keyword
Attribute 21: CSP extension
Attribute 22: JSON property name

@Stephane Devin 
You can use %SyntaxColor to parse JavaScript. Here's a very simple example that reads in a JS file, parses it, and returns a JSON representation of the semantic tokens:

ClassMethod JSTokens() As %Boolean
{
    #; Reading from a file, writing to a temporary stream
    Set syn = ##class(%SyntaxColor).%New(), in = ##class(%Stream.FileCharacter).%New(), out = ##class(%Stream.TmpCharacter).%New()
    #; Need the "K" flag to get JSON output
    Do in.LinkToFile("/Users/bsaviano/Desktop/test.js"), syn.Color(in,out,"JS","K")
    #; Get a %DynamicArray from the stream
    Set tokens = ##class(%DynamicArray).%FromJSON(out)
    #; Process JSON ...
    #; JSON is of the format:
    #; { 
    #;     // The position of the token within the line
    #;     p: number;
    #;     // The length of the token
    #;     c: number; 
    #;     // Language number, see %SyntaxColor::Languages()
    #;     l: number; 
    #;     // Attribute number, see %SyntaxColor::Attributes()
    #;     s: number; 
    #; }[][]
    #; Where there is one array per line of the source document
}

I suggest you study the class reference for %Library.SyntaxColor since it's not that easy to use.

@Nicki Vallentgoed 
There isn't a way to check if a file is out of date without saving it. I think the best change you could make to your workflow would be using a private server instead of a shared server. Since you're working with local files, you shouldn't care about the server version since it's not the source of truth. If you used your own private development server you could turn off the version checking logic and let your source control system handle differences.