@tryglen/cli 0.28.3 → 0.28.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,15 @@
1
1
  declare const canonicalRemoteUrl: (raw: string) => string | null;
2
+ /** Outcome of the `rev-parse --show-toplevel` probe that gates every other git
3
+ * field. Reported to the server so a dropped repo/branch ref is attributable. */
4
+ type WorkspaceProbe = "ok" | "not_a_repo" | "git_missing" | "git_timeout" | "git_denied" | "git_empty_output" | "git_failed";
2
5
  type WorkspaceContext = {
3
6
  readonly cwd?: string;
4
7
  readonly repoName?: string;
5
8
  readonly branch?: string;
6
9
  readonly commit?: string;
7
10
  readonly remoteUrl?: string;
11
+ readonly probe?: WorkspaceProbe;
8
12
  };
9
13
  declare const gitContext: (cwd: string) => WorkspaceContext;
10
14
  export { canonicalRemoteUrl, gitContext };
11
- export type { WorkspaceContext };
15
+ export type { WorkspaceContext, WorkspaceProbe };
@@ -1,17 +1,45 @@
1
1
  import { execFileSync } from "node:child_process";
2
2
  import { basename } from "node:path";
3
- const git = (cwd, args) => {
3
+ const GIT_TIMEOUT_MS = 150;
4
+ const runGit = (cwd, args) => {
4
5
  try {
5
- return (execFileSync("git", ["-C", cwd, ...args], {
6
+ const output = execFileSync("git", ["-C", cwd, ...args], {
6
7
  stdio: ["ignore", "pipe", "ignore"],
7
- timeout: 150,
8
+ timeout: GIT_TIMEOUT_MS,
8
9
  encoding: "utf8",
9
- }).trim() || null);
10
+ }).trim() || null;
11
+ // Exit 0 with nothing on stdout shouldn't happen for the commands we run;
12
+ // classify it rather than silently folding it into "not a repo".
13
+ return { output, probe: output ? "ok" : "git_empty_output" };
10
14
  }
11
- catch {
12
- return null;
15
+ catch (error) {
16
+ return { output: null, probe: classifyGitFailure(error) };
13
17
  }
14
18
  };
19
+ /** Why `git` did not answer. Every one of these currently collapses to the same
20
+ * observable state — a workspace with a cwd and no repoName — and they need
21
+ * completely different responses, so they are reported separately.
22
+ *
23
+ * `git_timeout` is measured, not fixed, here: GIT_TIMEOUT_MS stays at its
24
+ * original value so the logs say whether it is actually being hit before anyone
25
+ * changes it. (`rev-parse --show-toplevel` measures 10-20ms on a 69MB .git, so
26
+ * there is ~10x headroom locally — but that says nothing about a contended
27
+ * machine or a network filesystem.) */
28
+ const classifyGitFailure = (error) => {
29
+ const err = error;
30
+ if (err?.code === "ENOENT")
31
+ return "git_missing";
32
+ if (err?.code === "ETIMEDOUT" || err?.killed === true)
33
+ return "git_timeout";
34
+ if (err?.code === "EACCES")
35
+ return "git_denied";
36
+ // A non-zero exit from `rev-parse --show-toplevel` is git working correctly
37
+ // and telling us this path is not inside a checkout.
38
+ if (typeof err?.status === "number" && err.status !== 0)
39
+ return "not_a_repo";
40
+ return "git_failed";
41
+ };
42
+ const git = (cwd, args) => runGit(cwd, args).output;
15
43
  const SSH_PATTERN = /^(?:ssh:\/\/)?[^@]+@([^:/]+)(?::\d+)?[:/](.+?)(?:\.git)?$/;
16
44
  const HTTPS_PATTERN = /^https?:\/\/(?:[^@/]+@)?([^/]+)\/(.+?)(?:\.git)?\/?\s*$/;
17
45
  const canonicalRemoteUrl = (raw) => {
@@ -33,9 +61,10 @@ const canonicalRemoteUrl = (raw) => {
33
61
  return null;
34
62
  };
35
63
  const gitContext = (cwd) => {
36
- const toplevel = git(cwd, ["rev-parse", "--show-toplevel"]);
64
+ const top = runGit(cwd, ["rev-parse", "--show-toplevel"]);
65
+ const toplevel = top.output;
37
66
  if (!toplevel)
38
- return { cwd };
67
+ return { cwd, probe: top.probe };
39
68
  const branch = git(cwd, ["rev-parse", "--abbrev-ref", "HEAD"]);
40
69
  const commit = git(cwd, ["rev-parse", "--short", "HEAD"]);
41
70
  const trackingRemote = branch && branch !== "HEAD"
@@ -48,6 +77,7 @@ const gitContext = (cwd) => {
48
77
  const normalized = remote ? canonicalRemoteUrl(remote) : null;
49
78
  return {
50
79
  cwd,
80
+ probe: "ok",
51
81
  repoName: basename(toplevel),
52
82
  ...(branch ? { branch } : {}),
53
83
  ...(commit ? { commit } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"git-context.js","sourceRoot":"","sources":["../../src/_utils/git-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-context.js","sourceRoot":"","sources":["../../src/_utils/git-context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tryglen/cli",
3
- "version": "0.28.3",
3
+ "version": "0.28.4",
4
4
  "description": "Glen CLI — memory for coding agents",
5
5
  "type": "module",
6
6
  "bin": {