Thinking out loud, and without discussing various places where "Git repository" might be described one way or the other, a "repository" is a place where *something* is *stored*.
"Source code repository" would thus be a place where source code is stored, possibly with some metadata (current version, last change, etc.), but not necessarily the whole (versioned) history. For storage purpose alone, Git's own working tree could be then considered a repository in its own right (source code repository, if it contains source code, but it could contain other stuff as well, in addition or standalone). But as soon as you start working in it it's not really (only) a storage anymore (so not a repository), but a working area. It's more of a conceptual thing.
So if we strictly speak of "Git repository", I think it should be a place where Git keeps (stores) your (committed) work, alongside its own (meta)data - and that is the ".git" directory, indeed. Seems simple enough :)
One place where the confusion might be extended is the notion of "bare repository" for ".git" directory alone (without the working tree), which should then imply ".git" + working tree is in fact "a repository"... which it is, but bare with me - pun intended :)
As Git is mainly used to version artifacts being more or less actively worked on (changing, that is), one needs a working area in order to do the actual work, thus we have a working tree happily and conveniently provided by Git by default, as part of *working with* a Git repository.
As you said, having ".git" directory alone is enough to recreate the contents of the working tree, where if you would have the working tree alone, even if that could be considered to be "a repository" (for storage, not work), you would definitely not have "a Git repository" (no ".git" directory).
Also, when you work with a remote Git repository, it's only the committed stuff you can work with - what's inside ".git". You have no idea of contents of a working tree (and ideally not knowing if one even exists, though that's not always the case, like if you try to push to a checked out branch).
For some additional understanding, I guess we can compare "repository" with "archive", possibly being a more familiar concept - you can store source code somewhere, and that's your archive. You don't work on it in there, as then it would not be an archive anymore, but you keep it as a backup which you can always retrieve if needed.
If you use ZIP to compress your archive, it's then a "ZIP archive".
And for the most of the time these two would in fact be interchangeable
- you can have one or the other, being able to recreate one from the
other (unlike with ".git" and working tree).
BUT, if you add some additional (meta)data to your ZIP archive - like password, description, etc. - then the two are not interchangeable anymore, "ZIP archive" not being the same as "archive", not being able to be recreated from it.
To conclude - Git's concept of a "working tree" alone could be "a repository" (used for storage, not working), but it's not "a Git repository" without the ".git" directory in it. On the other hand, while "Git repository" must have a ".git" directory, it can have a "working tree", too - but it doesn't need to (called "bare [Git] repository" in such a case), as it can be completely recreated from ".git" directory alone, being a mere convenience in order to be able to do the actual (development) work (and not required for "Git repository" to be a "repository").
Finally, as "Git repository" could be referred to as only a "repository" for brevity (which it is, in general), it's important to notice the latter might be ambiguous (as it does not imply "Git repository" in particular), thus using "Git repository" when being in the clear is paramount, indicating that you're interested in ".git" directory precisely (and possibly, but not necessarily the working tree as well). If interested in ".git" directory alone, "bare Git repository" is the most precise term.
Regards, Buga