@procedures/git 0.0.0-stage → 0.2.0

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.
Files changed (120) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1130 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/index.d.ts +20 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +20 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/module.d.ts +22 -0
  10. package/dist/module.d.ts.map +1 -0
  11. package/dist/module.js +514 -0
  12. package/dist/module.js.map +1 -0
  13. package/dist/procedures/git/add.d.ts +12 -0
  14. package/dist/procedures/git/add.d.ts.map +1 -0
  15. package/dist/procedures/git/add.js +26 -0
  16. package/dist/procedures/git/add.js.map +1 -0
  17. package/dist/procedures/git/args.d.ts +15 -0
  18. package/dist/procedures/git/args.d.ts.map +1 -0
  19. package/dist/procedures/git/args.js +20 -0
  20. package/dist/procedures/git/args.js.map +1 -0
  21. package/dist/procedures/git/branch.d.ts +12 -0
  22. package/dist/procedures/git/branch.d.ts.map +1 -0
  23. package/dist/procedures/git/branch.js +54 -0
  24. package/dist/procedures/git/branch.js.map +1 -0
  25. package/dist/procedures/git/checkout.d.ts +12 -0
  26. package/dist/procedures/git/checkout.d.ts.map +1 -0
  27. package/dist/procedures/git/checkout.js +23 -0
  28. package/dist/procedures/git/checkout.js.map +1 -0
  29. package/dist/procedures/git/clone.d.ts +12 -0
  30. package/dist/procedures/git/clone.d.ts.map +1 -0
  31. package/dist/procedures/git/clone.js +28 -0
  32. package/dist/procedures/git/clone.js.map +1 -0
  33. package/dist/procedures/git/commit.d.ts +12 -0
  34. package/dist/procedures/git/commit.d.ts.map +1 -0
  35. package/dist/procedures/git/commit.js +41 -0
  36. package/dist/procedures/git/commit.js.map +1 -0
  37. package/dist/procedures/git/diff.d.ts +18 -0
  38. package/dist/procedures/git/diff.d.ts.map +1 -0
  39. package/dist/procedures/git/diff.js +58 -0
  40. package/dist/procedures/git/diff.js.map +1 -0
  41. package/dist/procedures/git/fetch.d.ts +12 -0
  42. package/dist/procedures/git/fetch.d.ts.map +1 -0
  43. package/dist/procedures/git/fetch.js +29 -0
  44. package/dist/procedures/git/fetch.js.map +1 -0
  45. package/dist/procedures/git/index.d.ts +15 -0
  46. package/dist/procedures/git/index.d.ts.map +1 -0
  47. package/dist/procedures/git/index.js +15 -0
  48. package/dist/procedures/git/index.js.map +1 -0
  49. package/dist/procedures/git/init.d.ts +12 -0
  50. package/dist/procedures/git/init.d.ts.map +1 -0
  51. package/dist/procedures/git/init.js +32 -0
  52. package/dist/procedures/git/init.js.map +1 -0
  53. package/dist/procedures/git/log.d.ts +12 -0
  54. package/dist/procedures/git/log.d.ts.map +1 -0
  55. package/dist/procedures/git/log.js +35 -0
  56. package/dist/procedures/git/log.js.map +1 -0
  57. package/dist/procedures/git/predicates.d.ts +40 -0
  58. package/dist/procedures/git/predicates.d.ts.map +1 -0
  59. package/dist/procedures/git/predicates.js +76 -0
  60. package/dist/procedures/git/predicates.js.map +1 -0
  61. package/dist/procedures/git/pull.d.ts +12 -0
  62. package/dist/procedures/git/pull.d.ts.map +1 -0
  63. package/dist/procedures/git/pull.js +36 -0
  64. package/dist/procedures/git/pull.js.map +1 -0
  65. package/dist/procedures/git/push.d.ts +12 -0
  66. package/dist/procedures/git/push.d.ts.map +1 -0
  67. package/dist/procedures/git/push.js +39 -0
  68. package/dist/procedures/git/push.js.map +1 -0
  69. package/dist/procedures/git/remote.d.ts +13 -0
  70. package/dist/procedures/git/remote.d.ts.map +1 -0
  71. package/dist/procedures/git/remote.js +30 -0
  72. package/dist/procedures/git/remote.js.map +1 -0
  73. package/dist/procedures/git/run.d.ts +32 -0
  74. package/dist/procedures/git/run.d.ts.map +1 -0
  75. package/dist/procedures/git/run.js +60 -0
  76. package/dist/procedures/git/run.js.map +1 -0
  77. package/dist/procedures/git/stash.d.ts +38 -0
  78. package/dist/procedures/git/stash.d.ts.map +1 -0
  79. package/dist/procedures/git/stash.js +211 -0
  80. package/dist/procedures/git/stash.js.map +1 -0
  81. package/dist/procedures/git/status.d.ts +17 -0
  82. package/dist/procedures/git/status.d.ts.map +1 -0
  83. package/dist/procedures/git/status.js +107 -0
  84. package/dist/procedures/git/status.js.map +1 -0
  85. package/dist/procedures/git.d.ts +5 -0
  86. package/dist/procedures/git.d.ts.map +1 -0
  87. package/dist/procedures/git.js +5 -0
  88. package/dist/procedures/git.js.map +1 -0
  89. package/dist/register.d.ts +7 -0
  90. package/dist/register.d.ts.map +1 -0
  91. package/dist/register.js +9 -0
  92. package/dist/register.js.map +1 -0
  93. package/dist/types.d.ts +350 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +397 -0
  96. package/dist/types.js.map +1 -0
  97. package/package.json +77 -3
  98. package/src/index.ts +20 -0
  99. package/src/module.ts +656 -0
  100. package/src/procedures/git/add.ts +29 -0
  101. package/src/procedures/git/args.ts +21 -0
  102. package/src/procedures/git/branch.ts +61 -0
  103. package/src/procedures/git/checkout.ts +27 -0
  104. package/src/procedures/git/clone.ts +33 -0
  105. package/src/procedures/git/commit.ts +46 -0
  106. package/src/procedures/git/diff.ts +62 -0
  107. package/src/procedures/git/fetch.ts +32 -0
  108. package/src/procedures/git/index.ts +22 -0
  109. package/src/procedures/git/init.ts +43 -0
  110. package/src/procedures/git/log.ts +40 -0
  111. package/src/procedures/git/predicates.ts +90 -0
  112. package/src/procedures/git/pull.ts +45 -0
  113. package/src/procedures/git/push.ts +42 -0
  114. package/src/procedures/git/remote.ts +31 -0
  115. package/src/procedures/git/run.ts +70 -0
  116. package/src/procedures/git/stash.ts +255 -0
  117. package/src/procedures/git/status.ts +98 -0
  118. package/src/procedures/git.ts +5 -0
  119. package/src/register.ts +11 -0
  120. package/src/types.ts +815 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Git predicate procedures
3
+ *
4
+ * Simple boolean predicates for conditional execution.
5
+ * These return true/false based on git repository state.
6
+ */
7
+ import { git, GitError } from "./run.js";
8
+ /**
9
+ * The output of a git command, or null when git fails (for example outside a repository).
10
+ * An aborted signal still throws.
11
+ */
12
+ async function gitOrNull(args, cwd, ctx) {
13
+ try {
14
+ return (await git(args, { cwd, signal: ctx.signal })).trim();
15
+ }
16
+ catch (error) {
17
+ if (error instanceof GitError)
18
+ return null;
19
+ throw error;
20
+ }
21
+ }
22
+ /**
23
+ * Check if there are any changes (unstaged, staged, or untracked)
24
+ */
25
+ export async function gitHasChanges(input, ctx = {}) {
26
+ const status = await gitOrNull(["status", "--porcelain"], input.cwd, ctx);
27
+ return { value: status !== null && status.length > 0 };
28
+ }
29
+ /**
30
+ * Check if there are any staged changes ready to commit
31
+ */
32
+ export async function gitHasStagedChanges(input, ctx = {}) {
33
+ // git diff --cached shows only staged changes
34
+ const diff = await gitOrNull(["diff", "--cached", "--name-only"], input.cwd, ctx);
35
+ return { value: diff !== null && diff.length > 0 };
36
+ }
37
+ /**
38
+ * Check if there are any unstaged changes (modified or deleted files)
39
+ */
40
+ export async function gitHasUnstagedChanges(input, ctx = {}) {
41
+ // git diff shows only unstaged changes to tracked files
42
+ const diff = await gitOrNull(["diff", "--name-only"], input.cwd, ctx);
43
+ return { value: diff !== null && diff.length > 0 };
44
+ }
45
+ /**
46
+ * Check if there are any untracked files
47
+ */
48
+ export async function gitHasUntrackedFiles(input, ctx = {}) {
49
+ // List untracked files only
50
+ const untracked = await gitOrNull(["ls-files", "--others", "--exclude-standard"], input.cwd, ctx);
51
+ return { value: untracked !== null && untracked.length > 0 };
52
+ }
53
+ /**
54
+ * Check if there are local commits that haven't been pushed
55
+ */
56
+ export async function gitHasLocalCommits(input, ctx = {}) {
57
+ // Get the upstream tracking branch
58
+ const upstream = await gitOrNull(["rev-parse", "--abbrev-ref", "@{upstream}"], input.cwd, ctx);
59
+ if (upstream !== null) {
60
+ // Count commits ahead of upstream
61
+ const count = await gitOrNull(["rev-list", "--count", `${upstream}..HEAD`], input.cwd, ctx);
62
+ if (count !== null)
63
+ return { value: parseInt(count, 10) > 0 };
64
+ }
65
+ // No upstream or error - HEAD exists but no upstream: treat as having local commits
66
+ const head = await gitOrNull(["rev-parse", "HEAD"], input.cwd, ctx);
67
+ return { value: head !== null };
68
+ }
69
+ /**
70
+ * Check if the working directory is clean (no changes at all)
71
+ */
72
+ export async function gitIsClean(input, ctx = {}) {
73
+ const result = await gitHasChanges(input, ctx);
74
+ return { value: !result.value };
75
+ }
76
+ //# sourceMappingURL=predicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../../src/procedures/git/predicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * git.pull procedure
3
+ *
4
+ * Pull from remote
5
+ */
6
+ import { type GitContext } from "./run.js";
7
+ import type { GitPullInput, GitPullOutput } from "../../types.js";
8
+ /**
9
+ * Pull from remote
10
+ */
11
+ export declare function gitPull(input: GitPullInput, ctx?: GitContext): Promise<GitPullOutput>;
12
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/pull.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAO,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAElE;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA+B/F"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * git.pull procedure
3
+ *
4
+ * Pull from remote
5
+ */
6
+ import { gitArg } from "./args.js";
7
+ import { git } from "./run.js";
8
+ /**
9
+ * Pull from remote
10
+ */
11
+ export async function gitPull(input, ctx = {}) {
12
+ const { branch, rebase, cwd } = input;
13
+ const remoteName = input.remote ?? "origin";
14
+ const run = { cwd, signal: ctx.signal };
15
+ // Get current branch if not specified
16
+ const branchName = branch || (await git(["rev-parse", "--abbrev-ref", "HEAD"], run)).trim();
17
+ // Get current HEAD before pull
18
+ const beforeHead = (await git(["rev-parse", "HEAD"], run)).trim();
19
+ const args = ["pull"];
20
+ if (rebase)
21
+ args.push("--rebase");
22
+ args.push(gitArg("remote", remoteName), gitArg("branch", branchName));
23
+ await git(args, run);
24
+ // Get new HEAD after pull
25
+ const afterHead = (await git(["rev-parse", "HEAD"], run)).trim();
26
+ // Count new commits
27
+ let commits = 0;
28
+ if (beforeHead !== afterHead) {
29
+ const count = (await git(["rev-list", "--count", `${beforeHead}..${afterHead}`], run)).trim();
30
+ commits = parseInt(count, 10) || 0;
31
+ }
32
+ // Check if it was fast-forward
33
+ const fastForward = !rebase && beforeHead !== afterHead;
34
+ return { remote: remoteName, branch: branchName, commits, fastForward };
35
+ }
36
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/procedures/git/pull.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAmB,MAAM,UAAU,CAAC;AAGhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB,EAAE,GAAG,GAAe,EAAE;IACrE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAExC,sCAAsC;IACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5F,+BAA+B;IAC/B,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElE,MAAM,IAAI,GAAa,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAEtE,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAErB,0BAA0B;IAC1B,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEjE,oBAAoB;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,UAAU,KAAK,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9F,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,UAAU,KAAK,SAAS,CAAC;IAExD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * git.push procedure
3
+ *
4
+ * Push to remote
5
+ */
6
+ import { type GitContext } from "./run.js";
7
+ import type { GitPushInput, GitPushOutput } from "../../types.js";
8
+ /**
9
+ * Push to remote
10
+ */
11
+ export declare function gitPush(input: GitPushInput, ctx?: GitContext): Promise<GitPushOutput>;
12
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAElE;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA4B/F"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * git.push procedure
3
+ *
4
+ * Push to remote
5
+ */
6
+ import { gitArg } from "./args.js";
7
+ import { git, GitError } from "./run.js";
8
+ /**
9
+ * Push to remote
10
+ */
11
+ export async function gitPush(input, ctx = {}) {
12
+ const { branch, force, setUpstream, cwd } = input;
13
+ const remoteName = input.remote ?? "origin";
14
+ const run = { cwd, signal: ctx.signal };
15
+ // Get current branch if not specified
16
+ const branchName = branch || (await git(["rev-parse", "--abbrev-ref", "HEAD"], run)).trim();
17
+ // Count commits to push
18
+ let commits = 0;
19
+ try {
20
+ const count = (await git(["rev-list", "--count", `${remoteName}/${branchName}..HEAD`], run)).trim();
21
+ commits = parseInt(count, 10) || 0;
22
+ }
23
+ catch (error) {
24
+ // Remote branch may not exist yet
25
+ if (!(error instanceof GitError))
26
+ throw error;
27
+ const count = (await git(["rev-list", "--count", "HEAD"], run)).trim();
28
+ commits = parseInt(count, 10) || 0;
29
+ }
30
+ const args = ["push"];
31
+ if (setUpstream)
32
+ args.push("-u");
33
+ if (force)
34
+ args.push("--force");
35
+ args.push(gitArg("remote", remoteName), gitArg("branch", branchName));
36
+ await git(args, run);
37
+ return { remote: remoteName, branch: branchName, commits };
38
+ }
39
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/procedures/git/push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAG1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB,EAAE,GAAG,GAAe,EAAE;IACrE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAClD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAExC,sCAAsC;IACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5F,wBAAwB;IACxB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,UAAU,IAAI,UAAU,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpG,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kCAAkC;QAClC,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAa,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAEtE,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAErB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * git.remote and git.remote.set
3
+ *
4
+ * git.remote reads the URL of a remote. git.remote.set replaces it, or adds the remote. Two
5
+ * procedures, so that a reader of the URL declares that it changes nothing (CAPABILITIES-2026-10).
6
+ */
7
+ import { type GitContext } from "./run.js";
8
+ import type { GitRemoteInput, GitRemoteOutput, GitRemoteSetInput } from "../../types.js";
9
+ /** This function gives the URL of a remote. */
10
+ export declare function gitRemote(input: GitRemoteInput, ctx?: GitContext): Promise<GitRemoteOutput>;
11
+ /** This function sets the URL of a remote, and adds the remote when it is missing. */
12
+ export declare function gitRemoteSet(input: GitRemoteSetInput, ctx?: GitContext): Promise<GitRemoteOutput>;
13
+ //# sourceMappingURL=remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/remote.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEzF,+CAA+C;AAC/C,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAIrG;AAED,sFAAsF;AACtF,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAW3G"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * git.remote and git.remote.set
3
+ *
4
+ * git.remote reads the URL of a remote. git.remote.set replaces it, or adds the remote. Two
5
+ * procedures, so that a reader of the URL declares that it changes nothing (CAPABILITIES-2026-10).
6
+ */
7
+ import { gitArg } from "./args.js";
8
+ import { git, GitError } from "./run.js";
9
+ /** This function gives the URL of a remote. */
10
+ export async function gitRemote(input, ctx = {}) {
11
+ const { name, cwd } = input;
12
+ const url = (await git(["remote", "get-url", gitArg("name", name)], { cwd, signal: ctx.signal })).trim();
13
+ return { name, url };
14
+ }
15
+ /** This function sets the URL of a remote, and adds the remote when it is missing. */
16
+ export async function gitRemoteSet(input, ctx = {}) {
17
+ const { name, url, cwd } = input;
18
+ const run = { cwd, signal: ctx.signal };
19
+ try {
20
+ await git(["remote", "set-url", gitArg("name", name), gitArg("url", url)], run);
21
+ }
22
+ catch (error) {
23
+ // The remote is missing: add it
24
+ if (!(error instanceof GitError))
25
+ throw error;
26
+ await git(["remote", "add", gitArg("name", name), gitArg("url", url)], run);
27
+ }
28
+ return { name, url };
29
+ }
30
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/procedures/git/remote.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAG1D,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB,EAAE,GAAG,GAAe,EAAE;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzG,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB,EAAE,GAAG,GAAe,EAAE;IAC/E,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gCAAgC;QAChC,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;QAC9C,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * How the git procedures run git: through `runCommand` of client-shell (roadmap 2.2).
3
+ *
4
+ * Before, they called `execFileSync`: each git call blocked the event loop of the host (an MCP
5
+ * server or a warm `mark` server stopped all its other calls), and the signal of the call could
6
+ * not stop git. Now each call is async, the signal kills git, and the output has a limit.
7
+ */
8
+ /** The part of the procedure context that the git procedures read. */
9
+ export interface GitContext {
10
+ signal?: AbortSignal | undefined;
11
+ }
12
+ export interface GitRunOptions extends GitContext {
13
+ cwd?: string | undefined;
14
+ /** Text to write to the stdin of git (for example a patch for `git apply`). */
15
+ input?: string | undefined;
16
+ }
17
+ /** A git command that ended with an exit code other than 0. */
18
+ export declare class GitError extends Error {
19
+ readonly args: readonly string[];
20
+ readonly exitCode: number;
21
+ readonly stdout: string;
22
+ readonly stderr: string;
23
+ constructor(args: readonly string[], exitCode: number, stdout: string, stderr: string);
24
+ }
25
+ /**
26
+ * This function runs `git <args>` and gives its stdout. It throws a `GitError` when git fails,
27
+ * and an `AbortError` when the signal aborts.
28
+ */
29
+ export declare function git(args: string[], options?: GitRunOptions): Promise<string>;
30
+ /** This function splits output that git wrote with `-z` into its fields. */
31
+ export declare function zFields(output: string): string[];
32
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,+DAA+D;AAC/D,qBAAa,QAAS,SAAQ,KAAK;IAE/B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJzB,YACW,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAIxB;CACF;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBtF;AAED,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAIhD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * How the git procedures run git: through `runCommand` of client-shell (roadmap 2.2).
3
+ *
4
+ * Before, they called `execFileSync`: each git call blocked the event loop of the host (an MCP
5
+ * server or a warm `mark` server stopped all its other calls), and the signal of the call could
6
+ * not stop git. Now each call is async, the signal kills git, and the output has a limit.
7
+ */
8
+ import { runCommand } from "@procedures/shell/command";
9
+ import { GIT_MAX_BUFFER } from "./args.js";
10
+ /** A git command that ended with an exit code other than 0. */
11
+ export class GitError extends Error {
12
+ args;
13
+ exitCode;
14
+ stdout;
15
+ stderr;
16
+ constructor(args, exitCode, stdout, stderr) {
17
+ super(`git ${args.join(" ")} failed (exit ${exitCode}): ${(stderr || stdout).trim()}`);
18
+ this.args = args;
19
+ this.exitCode = exitCode;
20
+ this.stdout = stdout;
21
+ this.stderr = stderr;
22
+ this.name = "GitError";
23
+ }
24
+ }
25
+ /**
26
+ * This function runs `git <args>` and gives its stdout. It throws a `GitError` when git fails,
27
+ * and an `AbortError` when the signal aborts.
28
+ */
29
+ export async function git(args, options = {}) {
30
+ const result = await runCommand("git", {
31
+ args,
32
+ cwd: options.cwd,
33
+ signal: options.signal,
34
+ input: options.input,
35
+ maxOutputBytes: GIT_MAX_BUFFER,
36
+ });
37
+ if (result.aborted) {
38
+ const error = new Error(`git ${args[0]} was aborted`);
39
+ error.name = "AbortError";
40
+ throw error;
41
+ }
42
+ if (result.error) {
43
+ throw new Error(`git did not start: ${result.error}`);
44
+ }
45
+ if (result.truncated?.stdout) {
46
+ throw new Error(`The output of git ${args[0]} is longer than ${GIT_MAX_BUFFER} bytes`);
47
+ }
48
+ if (!result.success) {
49
+ throw new GitError(args, result.exitCode, result.stdout, result.stderr);
50
+ }
51
+ return result.stdout;
52
+ }
53
+ /** This function splits output that git wrote with `-z` into its fields. */
54
+ export function zFields(output) {
55
+ const fields = output.split("\0");
56
+ if (fields.at(-1) === "")
57
+ fields.pop();
58
+ return fields;
59
+ }
60
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/procedures/git/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAa3C,+DAA+D;AAC/D,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,MAAM;IAJjB,YACW,IAAuB,EACvB,QAAgB,EAChB,MAAc,EACd,MAAc;QAEvB,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,QAAQ,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAL9E,IAAI;wBACJ,QAAQ;sBACR,MAAM;sBACN,MAAM;QAGf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,OAAO,GAAkB,EAAE;IACnE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;QACrC,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,mBAAmB,cAAc,QAAQ,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * git.stash.* procedures
3
+ *
4
+ * Stash operations for saving and restoring work in progress.
5
+ * Includes export/import for snapshot storage.
6
+ */
7
+ import { type GitContext } from "./run.js";
8
+ import type { GitStashListInput, GitStashListOutput, GitStashPushInput, GitStashPushOutput, GitStashPopInput, GitStashPopOutput, GitStashApplyInput, GitStashApplyOutput, GitStashDropInput, GitStashDropOutput, GitStashExportInput, GitStashExportOutput, GitStashImportInput, GitStashImportOutput } from "../../types.js";
9
+ /**
10
+ * List all stashes
11
+ */
12
+ export declare function gitStashList(input: GitStashListInput, ctx?: GitContext): Promise<GitStashListOutput>;
13
+ /**
14
+ * Push changes to stash
15
+ */
16
+ export declare function gitStashPush(input: GitStashPushInput, ctx?: GitContext): Promise<GitStashPushOutput>;
17
+ /**
18
+ * Pop stash (apply and remove)
19
+ */
20
+ export declare function gitStashPop(input: GitStashPopInput, ctx?: GitContext): Promise<GitStashPopOutput>;
21
+ /**
22
+ * Apply stash without removing
23
+ */
24
+ export declare function gitStashApply(input: GitStashApplyInput, ctx?: GitContext): Promise<GitStashApplyOutput>;
25
+ /**
26
+ * Drop a stash
27
+ */
28
+ export declare function gitStashDrop(input: GitStashDropInput, ctx?: GitContext): Promise<GitStashDropOutput>;
29
+ /**
30
+ * Export a stash as a patch (for snapshot storage)
31
+ */
32
+ export declare function gitStashExport(input: GitStashExportInput, ctx?: GitContext): Promise<GitStashExportOutput>;
33
+ /**
34
+ * Import a stash from a patch (for snapshot restore)
35
+ * Note: This creates a new stash, it doesn't recreate the exact stash state
36
+ */
37
+ export declare function gitStashImport(input: GitStashImportInput, ctx?: GitContext): Promise<GitStashImportOutput>;
38
+ //# sourceMappingURL=stash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stash.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/stash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EAErB,MAAM,gBAAgB,CAAC;AAqBxB;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgC9G;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0C9G;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAe3G;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAcjH;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW9G;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmCpH;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBpH"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * git.stash.* procedures
3
+ *
4
+ * Stash operations for saving and restoring work in progress.
5
+ * Includes export/import for snapshot storage.
6
+ */
7
+ import { gitArg } from "./args.js";
8
+ import { git, GitError } from "./run.js";
9
+ /**
10
+ * True when git stopped on a merge conflict. Git writes "CONFLICT (content): ..." to stdout,
11
+ * so the message alone (which has stderr) does not show it. (Before, the procedures examined
12
+ * only the message, and never reported a conflict.)
13
+ */
14
+ function isConflict(error) {
15
+ return error instanceof GitError && /conflict/i.test(`${error.stdout}\n${error.stderr}`);
16
+ }
17
+ /** The message of a git failure. An abort is not a git failure: it throws again. */
18
+ function failure(error) {
19
+ if (!(error instanceof GitError))
20
+ throw error;
21
+ return error.message;
22
+ }
23
+ function stashRef(index) {
24
+ return index !== undefined ? `stash@{${index}}` : "stash@{0}";
25
+ }
26
+ /**
27
+ * List all stashes
28
+ */
29
+ export async function gitStashList(input, ctx = {}) {
30
+ const cwd = input.cwd || process.cwd();
31
+ let output;
32
+ try {
33
+ // Get stash list with format: stash@{n}: WIP on branch: message
34
+ output = await git(["stash", "list", "--format=%H%x00%gd%x00%gs"], { cwd, signal: ctx.signal });
35
+ }
36
+ catch (error) {
37
+ // No stashes or not a git repo
38
+ failure(error);
39
+ return { stashes: [], count: 0 };
40
+ }
41
+ const stashes = [];
42
+ for (const line of output.split("\n").filter(Boolean)) {
43
+ const parts = line.split("\0");
44
+ const hash = parts[0] || "";
45
+ const ref = parts[1] || "";
46
+ const message = parts[2] || "";
47
+ // Extract index from stash@{n}
48
+ const indexMatch = ref.match(/stash@\{(\d+)\}/);
49
+ const index = indexMatch && indexMatch[1] ? parseInt(indexMatch[1], 10) : 0;
50
+ stashes.push({
51
+ index,
52
+ ref,
53
+ hash,
54
+ message,
55
+ });
56
+ }
57
+ return { stashes, count: stashes.length };
58
+ }
59
+ /**
60
+ * Push changes to stash
61
+ */
62
+ export async function gitStashPush(input, ctx = {}) {
63
+ const cwd = input.cwd || process.cwd();
64
+ const run = { cwd, signal: ctx.signal };
65
+ const args = ["stash", "push"];
66
+ if (input.message) {
67
+ args.push("-m", input.message);
68
+ }
69
+ if (input.includeUntracked) {
70
+ args.push("--include-untracked");
71
+ }
72
+ if (input.keepIndex) {
73
+ args.push("--keep-index");
74
+ }
75
+ if (input.paths && input.paths.length > 0) {
76
+ args.push("--");
77
+ args.push(...input.paths);
78
+ }
79
+ try {
80
+ const output = await git(args, run);
81
+ // Check if anything was stashed
82
+ if (output.includes("No local changes to save")) {
83
+ return { stashed: false, message: "No local changes to save" };
84
+ }
85
+ // Get the ref of the new stash
86
+ const refOutput = (await git(["stash", "list", "-1", "--format=%gd"], run)).trim();
87
+ return {
88
+ stashed: true,
89
+ ref: refOutput || "stash@{0}",
90
+ message: input.message || "WIP",
91
+ };
92
+ }
93
+ catch (error) {
94
+ return { stashed: false, message: failure(error) || "Failed to stash" };
95
+ }
96
+ }
97
+ /**
98
+ * Pop stash (apply and remove)
99
+ */
100
+ export async function gitStashPop(input, ctx = {}) {
101
+ const cwd = input.cwd || process.cwd();
102
+ const ref = stashRef(input.index);
103
+ try {
104
+ await git(["stash", "pop", gitArg("ref", ref)], { cwd, signal: ctx.signal });
105
+ return { applied: true, ref, dropped: true };
106
+ }
107
+ catch (error) {
108
+ // Check if it's a conflict
109
+ if (isConflict(error)) {
110
+ return { applied: false, ref, dropped: false, conflict: true };
111
+ }
112
+ failure(error);
113
+ return { applied: false, ref, dropped: false };
114
+ }
115
+ }
116
+ /**
117
+ * Apply stash without removing
118
+ */
119
+ export async function gitStashApply(input, ctx = {}) {
120
+ const cwd = input.cwd || process.cwd();
121
+ const ref = stashRef(input.index);
122
+ try {
123
+ await git(["stash", "apply", gitArg("ref", ref)], { cwd, signal: ctx.signal });
124
+ return { applied: true, ref };
125
+ }
126
+ catch (error) {
127
+ if (isConflict(error)) {
128
+ return { applied: false, ref, conflict: true };
129
+ }
130
+ failure(error);
131
+ return { applied: false, ref };
132
+ }
133
+ }
134
+ /**
135
+ * Drop a stash
136
+ */
137
+ export async function gitStashDrop(input, ctx = {}) {
138
+ const cwd = input.cwd || process.cwd();
139
+ const ref = stashRef(input.index);
140
+ try {
141
+ await git(["stash", "drop", gitArg("ref", ref)], { cwd, signal: ctx.signal });
142
+ return { dropped: true, ref };
143
+ }
144
+ catch (error) {
145
+ failure(error);
146
+ return { dropped: false, ref };
147
+ }
148
+ }
149
+ /**
150
+ * Export a stash as a patch (for snapshot storage)
151
+ */
152
+ export async function gitStashExport(input, ctx = {}) {
153
+ const cwd = input.cwd || process.cwd();
154
+ const run = { cwd, signal: ctx.signal };
155
+ const ref = stashRef(input.index);
156
+ try {
157
+ // Get the stash as a patch
158
+ const patch = await git(["stash", "show", "-p", gitArg("ref", ref)], run);
159
+ // Get metadata
160
+ const metadata = (await git(["stash", "list", "-1", "--format=%H%x00%gs", ref], run)).trim();
161
+ const metaParts = metadata.split("\0");
162
+ const hash = metaParts[0] || "";
163
+ const message = metaParts[1] || "";
164
+ // Get untracked files if present (stash^3 contains untracked files if any)
165
+ let untrackedPatch = "";
166
+ try {
167
+ untrackedPatch = await git(["show", `${ref}^3`, "--format=", "--name-only"], run);
168
+ }
169
+ catch (error) {
170
+ // No untracked files in this stash
171
+ failure(error);
172
+ }
173
+ return {
174
+ ref,
175
+ hash,
176
+ message,
177
+ patch,
178
+ hasUntracked: untrackedPatch.length > 0,
179
+ untrackedPatch: untrackedPatch || undefined,
180
+ };
181
+ }
182
+ catch (error) {
183
+ throw new Error(`Failed to export stash ${ref}: ${failure(error)}`);
184
+ }
185
+ }
186
+ /**
187
+ * Import a stash from a patch (for snapshot restore)
188
+ * Note: This creates a new stash, it doesn't recreate the exact stash state
189
+ */
190
+ export async function gitStashImport(input, ctx = {}) {
191
+ const cwd = input.cwd || process.cwd();
192
+ const run = { cwd, signal: ctx.signal };
193
+ try {
194
+ // Apply the patch to working directory
195
+ await git(["apply", "--3way"], { ...run, input: input.patch });
196
+ // Stash the changes with the original message
197
+ const message = input.message || "Imported stash";
198
+ const args = ["stash", "push", "-m", message];
199
+ if (input.includeUntracked) {
200
+ args.push("--include-untracked");
201
+ }
202
+ await git(args, run);
203
+ // Get the new stash ref
204
+ const ref = (await git(["stash", "list", "-1", "--format=%gd"], run)).trim();
205
+ return { imported: true, ref: ref || "stash@{0}" };
206
+ }
207
+ catch (error) {
208
+ return { imported: false, error: failure(error) || "Failed to import stash" };
209
+ }
210
+ }
211
+ //# sourceMappingURL=stash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stash.js","sourceRoot":"","sources":["../../../src/procedures/git/stash.ts"],"names":[],"mappings":"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"}