@ozyman42/ozy-cli 0.4.9-windows-x64.0 → 0.4.9

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 (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -0
  3. package/bin/ozy +209 -0
  4. package/bin/ozy-signing-agent +209 -0
  5. package/bin/ozy-ssh-keygen +209 -0
  6. package/bin/ozy-virtual-security-key +209 -0
  7. package/dist/commands/git/hosts.js +18 -0
  8. package/dist/commands/git/hosts.js.map +1 -0
  9. package/dist/commands/git/index.js +8 -0
  10. package/dist/commands/git/index.js.map +1 -0
  11. package/dist/commands/git/setup.js +145 -0
  12. package/dist/commands/git/setup.js.map +1 -0
  13. package/dist/commands/index.js +13 -0
  14. package/dist/commands/index.js.map +1 -0
  15. package/dist/commands/npm/index.js +7 -0
  16. package/dist/commands/npm/index.js.map +1 -0
  17. package/dist/commands/npm/setup/git-remote.js +66 -0
  18. package/dist/commands/npm/setup/git-remote.js.map +1 -0
  19. package/dist/commands/npm/setup/index.js +168 -0
  20. package/dist/commands/npm/setup/index.js.map +1 -0
  21. package/dist/commands/npm/setup/npm-auth.js +62 -0
  22. package/dist/commands/npm/setup/npm-auth.js.map +1 -0
  23. package/dist/commands/npm/setup/package-json-validate.js +47 -0
  24. package/dist/commands/npm/setup/package-json-validate.js.map +1 -0
  25. package/dist/commands/npm/setup/package-registry.js +20 -0
  26. package/dist/commands/npm/setup/package-registry.js.map +1 -0
  27. package/dist/commands/npm/setup/setup.test.js +95 -0
  28. package/dist/commands/npm/setup/setup.test.js.map +1 -0
  29. package/dist/commands/npm/setup/trusted-publishing.js +84 -0
  30. package/dist/commands/npm/setup/trusted-publishing.js.map +1 -0
  31. package/dist/commands/npm/setup/workflow.js +19 -0
  32. package/dist/commands/npm/setup/workflow.js.map +1 -0
  33. package/dist/commands/ssh/get-sk-credential.js +104 -0
  34. package/dist/commands/ssh/get-sk-credential.js.map +1 -0
  35. package/dist/commands/ssh/index.js +7 -0
  36. package/dist/commands/ssh/index.js.map +1 -0
  37. package/dist/commands/upgrade.js +236 -0
  38. package/dist/commands/upgrade.js.map +1 -0
  39. package/dist/common/command.js +15 -0
  40. package/dist/common/command.js.map +1 -0
  41. package/dist/common/constants.js +25 -0
  42. package/dist/common/constants.js.map +1 -0
  43. package/dist/common/effective-modules-extensions.js +13 -0
  44. package/dist/common/effective-modules-extensions.js.map +1 -0
  45. package/dist/common/log.js +4 -0
  46. package/dist/common/log.js.map +1 -0
  47. package/dist/common/render-caller-tree.js +20 -0
  48. package/dist/common/render-caller-tree.js.map +1 -0
  49. package/dist/entrypoints/ozy-signing-agent.js +48 -0
  50. package/dist/entrypoints/ozy-signing-agent.js.map +1 -0
  51. package/dist/entrypoints/ozy-ssh-keygen.js +9 -0
  52. package/dist/entrypoints/ozy-ssh-keygen.js.map +1 -0
  53. package/dist/entrypoints/ozy-virtual-security-key.js +18 -0
  54. package/dist/entrypoints/ozy-virtual-security-key.js.map +1 -0
  55. package/dist/entrypoints/ozy.js +3 -0
  56. package/dist/entrypoints/ozy.js.map +1 -0
  57. package/dist/index.js +2 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/internal/thing.js +4 -0
  60. package/dist/internal/thing.js.map +1 -0
  61. package/dist/modules/cli/agent-client/impl.js +109 -0
  62. package/dist/modules/cli/agent-client/impl.js.map +1 -0
  63. package/dist/modules/cli/agent-client/interface.js +11 -0
  64. package/dist/modules/cli/agent-client/interface.js.map +1 -0
  65. package/dist/modules/cli/git/impl.js +124 -0
  66. package/dist/modules/cli/git/impl.js.map +1 -0
  67. package/dist/modules/cli/git/interface.js +3 -0
  68. package/dist/modules/cli/git/interface.js.map +1 -0
  69. package/dist/modules/cli/git/submodule/fix.js +257 -0
  70. package/dist/modules/cli/git/submodule/fix.js.map +1 -0
  71. package/dist/modules/cli/git/submodule/git-state.js +154 -0
  72. package/dist/modules/cli/git/submodule/git-state.js.map +1 -0
  73. package/dist/modules/cli/git/submodule/gitmodules.js +113 -0
  74. package/dist/modules/cli/git/submodule/gitmodules.js.map +1 -0
  75. package/dist/modules/cli/git/submodule/printer.js +232 -0
  76. package/dist/modules/cli/git/submodule/printer.js.map +1 -0
  77. package/dist/modules/cli/git/submodule/resolve-git-dir.js +16 -0
  78. package/dist/modules/cli/git/submodule/resolve-git-dir.js.map +1 -0
  79. package/dist/modules/cli/github/impl.js +137 -0
  80. package/dist/modules/cli/github/impl.js.map +1 -0
  81. package/dist/modules/cli/github/interface.js +2 -0
  82. package/dist/modules/cli/github/interface.js.map +1 -0
  83. package/dist/modules/cli/index.js +9 -0
  84. package/dist/modules/cli/index.js.map +1 -0
  85. package/dist/modules/common/crypto/impl.js +133 -0
  86. package/dist/modules/common/crypto/impl.js.map +1 -0
  87. package/dist/modules/common/crypto/interface.js +2 -0
  88. package/dist/modules/common/crypto/interface.js.map +1 -0
  89. package/dist/modules/common/index.js +10 -0
  90. package/dist/modules/common/index.js.map +1 -0
  91. package/dist/modules/common/kep-map-store/impl.js +42 -0
  92. package/dist/modules/common/kep-map-store/impl.js.map +1 -0
  93. package/dist/modules/common/kep-map-store/interface.js +2 -0
  94. package/dist/modules/common/kep-map-store/interface.js.map +1 -0
  95. package/dist/modules/common/os-platform/caller-info.js +132 -0
  96. package/dist/modules/common/os-platform/caller-info.js.map +1 -0
  97. package/dist/modules/common/os-platform/impl.js +95 -0
  98. package/dist/modules/common/os-platform/impl.js.map +1 -0
  99. package/dist/modules/common/os-platform/interface.js +2 -0
  100. package/dist/modules/common/os-platform/interface.js.map +1 -0
  101. package/dist/modules/common/os-platform/virtual-hid/index.js +12 -0
  102. package/dist/modules/common/os-platform/virtual-hid/index.js.map +1 -0
  103. package/dist/modules/common/os-platform/virtual-hid/linux.js +5 -0
  104. package/dist/modules/common/os-platform/virtual-hid/linux.js.map +1 -0
  105. package/dist/modules/common/os-platform/virtual-hid/mac.js +119 -0
  106. package/dist/modules/common/os-platform/virtual-hid/mac.js.map +1 -0
  107. package/dist/modules/common/os-platform/virtual-hid/windows.js +5 -0
  108. package/dist/modules/common/os-platform/virtual-hid/windows.js.map +1 -0
  109. package/dist/modules/common/ssh-config/impl.js +116 -0
  110. package/dist/modules/common/ssh-config/impl.js.map +1 -0
  111. package/dist/modules/common/ssh-config/interface.js +10 -0
  112. package/dist/modules/common/ssh-config/interface.js.map +1 -0
  113. package/dist/modules/ssh-agent/index.js +8 -0
  114. package/dist/modules/ssh-agent/index.js.map +1 -0
  115. package/dist/modules/ssh-agent/session/impl.js +265 -0
  116. package/dist/modules/ssh-agent/session/impl.js.map +1 -0
  117. package/dist/modules/ssh-agent/session/interface-rpc.js +20 -0
  118. package/dist/modules/ssh-agent/session/interface-rpc.js.map +1 -0
  119. package/dist/modules/ssh-agent/session/interface.js +32 -0
  120. package/dist/modules/ssh-agent/session/interface.js.map +1 -0
  121. package/dist/modules/ssh-agent/session/passkey-prf-page.js +204 -0
  122. package/dist/modules/ssh-agent/session/passkey-prf-page.js.map +1 -0
  123. package/dist/modules/ssh-agent/session/prf-flow.js +103 -0
  124. package/dist/modules/ssh-agent/session/prf-flow.js.map +1 -0
  125. package/dist/modules/ssh-agent/ssh-agent/impl.js +117 -0
  126. package/dist/modules/ssh-agent/ssh-agent/impl.js.map +1 -0
  127. package/dist/modules/ssh-agent/ssh-agent/interface.js +2 -0
  128. package/dist/modules/ssh-agent/ssh-agent/interface.js.map +1 -0
  129. package/dist/scripts/build.js +444 -0
  130. package/dist/scripts/build.js.map +1 -0
  131. package/dist/scripts/check-npm-version.js +8 -0
  132. package/dist/scripts/check-npm-version.js.map +1 -0
  133. package/dist/scripts/constants.js +12 -0
  134. package/dist/scripts/constants.js.map +1 -0
  135. package/dist/scripts/kill-existing-agent.js +21 -0
  136. package/dist/scripts/kill-existing-agent.js.map +1 -0
  137. package/dist/scripts/publish.js +83 -0
  138. package/dist/scripts/publish.js.map +1 -0
  139. package/install.js +209 -0
  140. package/package.json +58 -11
  141. package/src/commands/git/hosts.ts +20 -0
  142. package/src/commands/git/index.ts +9 -0
  143. package/src/commands/git/setup.ts +182 -0
  144. package/src/commands/index.ts +15 -0
  145. package/src/commands/npm/index.ts +8 -0
  146. package/src/commands/npm/setup/git-remote.ts +78 -0
  147. package/src/commands/npm/setup/index.ts +189 -0
  148. package/src/commands/npm/setup/npm-auth.ts +58 -0
  149. package/src/commands/npm/setup/package-json-validate.ts +68 -0
  150. package/src/commands/npm/setup/package-registry.ts +24 -0
  151. package/src/commands/npm/setup/publish-workflow.yml +35 -0
  152. package/src/commands/npm/setup/setup.test.ts +117 -0
  153. package/src/commands/npm/setup/trusted-publishing.ts +106 -0
  154. package/src/commands/npm/setup/workflow.ts +20 -0
  155. package/src/commands/ssh/get-sk-credential.ts +110 -0
  156. package/src/commands/ssh/index.ts +8 -0
  157. package/src/commands/upgrade.ts +261 -0
  158. package/src/common/command.ts +16 -0
  159. package/src/common/constants.ts +26 -0
  160. package/src/common/effective-modules-extensions.ts +24 -0
  161. package/src/common/log.ts +3 -0
  162. package/src/common/render-caller-tree.ts +22 -0
  163. package/src/entrypoints/ozy-signing-agent.ts +48 -0
  164. package/src/entrypoints/ozy-ssh-keygen.ts +10 -0
  165. package/src/entrypoints/ozy-virtual-security-key.ts +21 -0
  166. package/src/entrypoints/ozy.ts +2 -0
  167. package/src/index.ts +1 -0
  168. package/src/internal/thing.ts +3 -0
  169. package/src/modules/cli/agent-client/impl.ts +152 -0
  170. package/src/modules/cli/agent-client/interface.ts +17 -0
  171. package/src/modules/cli/git/impl.ts +133 -0
  172. package/src/modules/cli/git/interface.ts +23 -0
  173. package/src/modules/cli/git/submodule/fix.ts +298 -0
  174. package/src/modules/cli/git/submodule/git-state.ts +217 -0
  175. package/src/modules/cli/git/submodule/gitmodules.ts +126 -0
  176. package/src/modules/cli/git/submodule/printer.ts +256 -0
  177. package/src/modules/cli/git/submodule/resolve-git-dir.ts +14 -0
  178. package/src/modules/cli/github/impl.ts +169 -0
  179. package/src/modules/cli/github/interface.ts +29 -0
  180. package/src/modules/cli/index.ts +16 -0
  181. package/src/modules/common/crypto/impl.ts +173 -0
  182. package/src/modules/common/crypto/interface.ts +20 -0
  183. package/src/modules/common/index.ts +19 -0
  184. package/src/modules/common/kep-map-store/impl.ts +47 -0
  185. package/src/modules/common/kep-map-store/interface.ts +9 -0
  186. package/src/modules/common/os-platform/caller-info.ts +152 -0
  187. package/src/modules/common/os-platform/impl.ts +91 -0
  188. package/src/modules/common/os-platform/interface.ts +16 -0
  189. package/src/modules/common/os-platform/virtual-hid/index.ts +12 -0
  190. package/src/modules/common/os-platform/virtual-hid/linux.ts +7 -0
  191. package/src/modules/common/os-platform/virtual-hid/mac.ts +150 -0
  192. package/src/modules/common/os-platform/virtual-hid/windows.ts +7 -0
  193. package/src/modules/common/ssh-config/impl.ts +130 -0
  194. package/src/modules/common/ssh-config/interface.ts +33 -0
  195. package/src/modules/ssh-agent/index.ts +13 -0
  196. package/src/modules/ssh-agent/session/agent-notes.md +210 -0
  197. package/src/modules/ssh-agent/session/design.md +2 -0
  198. package/src/modules/ssh-agent/session/html-refactor.md +23 -0
  199. package/src/modules/ssh-agent/session/impl.ts +328 -0
  200. package/src/modules/ssh-agent/session/interface-rpc.ts +24 -0
  201. package/src/modules/ssh-agent/session/interface.ts +62 -0
  202. package/src/modules/ssh-agent/session/passkey-prf-page.ts +224 -0
  203. package/src/modules/ssh-agent/session/prf-flow.ts +152 -0
  204. package/src/modules/ssh-agent/ssh-agent/impl.ts +136 -0
  205. package/src/modules/ssh-agent/ssh-agent/interface.ts +9 -0
  206. package/src/scripts/build.ts +559 -0
  207. package/src/scripts/check-npm-version.ts +7 -0
  208. package/src/scripts/command-launcher.js.ejs +186 -0
  209. package/src/scripts/constants.ts +11 -0
  210. package/src/scripts/kill-existing-agent.ts +22 -0
  211. package/src/scripts/publish.ts +89 -0
  212. package/src/scripts/windows-bin-shims.md +1104 -0
  213. package/multi-call-binary.exe +0 -0
@@ -0,0 +1,109 @@
1
+ import { Effect, Layer, Match, Option, pipe, Data, FileSystem, Schedule, Result } from "effect";
2
+ import { effunct, implementing } from "effective-modules";
3
+ import { FetchHttpClient } from "effect/unstable/http";
4
+ import { RpcClient, RpcSerialization } from "effect/unstable/rpc";
5
+ import { AgentRpcGroup } from "@/modules/ssh-agent/session/interface-rpc";
6
+ import { cliModules } from "..";
7
+ import { AgentClientError } from "./interface";
8
+ import { AGENT_CMD_PATH, AGENT_PID_FILE_PATH, AGENT_PORT_FILE_PATH, AGENT_SOCK_FILE_PATH, CURRENT_VERSION } from "@/common/constants";
9
+ import { readFileSync, rmSync } from "node:fs";
10
+ import { log } from "@/common/log";
11
+ function makeAgentClientLayer(port) {
12
+ return pipe(RpcClient.layerProtocolHttp({ url: `http://localhost:${port}/rpc` }), Layer.provideMerge(RpcSerialization.layerJson), Layer.provideMerge(FetchHttpClient.layer));
13
+ }
14
+ class NoResponseError extends Data.TaggedError("NoResponseError") {
15
+ toString() { return "No response from agent."; }
16
+ }
17
+ class NonMatchingVersionError extends Data.TaggedError("NonMatchingVersionError") {
18
+ toString() {
19
+ return `Agent running but with mismatched version ${this.agentVersion} compared to CLI version ${this.cliVersion}`;
20
+ }
21
+ }
22
+ export class AgentClientImpl extends implementing(cliModules.AgentClient).uses(FileSystem.FileSystem) {
23
+ *readPortFromFile() {
24
+ const result = yield* pipe(this.getDependency(FileSystem.FileSystem).readFileString(AGENT_PORT_FILE_PATH), Effect.result);
25
+ if (Result.isFailure(result))
26
+ return Option.none();
27
+ const port = parseInt(result.success.trim());
28
+ if (isNaN(port) || port <= 0 || port > 65535) {
29
+ log(`Read out of bounds port ${port}`);
30
+ return Option.none();
31
+ }
32
+ return Option.some(port);
33
+ }
34
+ *pingAtPort(port) {
35
+ yield* Effect.scoped(Effect.gen(function* () {
36
+ const client = yield* RpcClient.make(AgentRpcGroup);
37
+ const { version } = yield* pipe(client.GetVersion({}), Effect.catchTag("RpcClientError", () => new NoResponseError()));
38
+ if (version !== CURRENT_VERSION)
39
+ yield* new NonMatchingVersionError({ cliVersion: CURRENT_VERSION, agentVersion: version });
40
+ })).pipe(Effect.provide(makeAgentClientLayer(port)));
41
+ }
42
+ *ping() {
43
+ const portOption = yield* effunct(this.readPortFromFile)();
44
+ if (Option.isNone(portOption))
45
+ return yield* new NoResponseError();
46
+ const port = portOption.value;
47
+ yield* effunct(this.pingAtPort)(port);
48
+ return { port };
49
+ }
50
+ *waitForPidFile(expectedPid) {
51
+ const fs = this.getDependency(FileSystem.FileSystem);
52
+ yield* pipe(Effect.retry(pipe(fs.readFileString(AGENT_PID_FILE_PATH), Effect.catchTag("PlatformError", () => Effect.fail("pid file not yet written")), Effect.flatMap(content => {
53
+ const pid = parseInt(content.trim());
54
+ return pid === expectedPid
55
+ ? Effect.void
56
+ : Effect.fail(`PID mismatch: expected ${expectedPid}, got ${pid}`);
57
+ })), Schedule.spaced("50 millis")), Effect.timeout("5 seconds"), Effect.mapError(() => "Agent did not start within 5 seconds"));
58
+ }
59
+ *startAgent() {
60
+ const proc = Bun.spawn([AGENT_CMD_PATH], { stdout: "ignore", stderr: "ignore" });
61
+ yield* effunct(this.waitForPidFile)(proc.pid);
62
+ const { port } = yield* effunct(this.ping)();
63
+ log(`Started agent at PID ${proc.pid}`);
64
+ return { pid: proc.pid, port };
65
+ }
66
+ *killIfRunning() {
67
+ try {
68
+ // Throws if file missing
69
+ const pidFileContent = readFileSync(AGENT_PID_FILE_PATH, "utf-8");
70
+ const PID = parseInt(pidFileContent.trim());
71
+ // If doesn't exist, below line throws
72
+ process.kill(PID, 0);
73
+ log(`Killing agent on PID ${PID}`);
74
+ process.kill(PID, "SIGTERM");
75
+ yield* Effect.sleep(500);
76
+ }
77
+ catch { }
78
+ try {
79
+ rmSync(AGENT_PID_FILE_PATH);
80
+ }
81
+ catch { }
82
+ try {
83
+ rmSync(AGENT_PORT_FILE_PATH);
84
+ }
85
+ catch { }
86
+ try {
87
+ rmSync(AGENT_SOCK_FILE_PATH);
88
+ }
89
+ catch { }
90
+ }
91
+ *ensureRunning() {
92
+ const pingResult = yield* pipe(effunct(this.ping)(), Effect.result);
93
+ if (Result.isSuccess(pingResult))
94
+ return pingResult.success;
95
+ log(pingResult.failure.toString());
96
+ yield* Match.value(pingResult.failure).pipe(Match.tag("NonMatchingVersionError", () => effunct(this.killIfRunning)()), Match.tag("NoResponseError", () => effunct(this.killIfRunning)()), Match.exhaustive);
97
+ return yield* pipe(effunct(this.startAgent)(), Effect.mapError(err => typeof err === "string" ?
98
+ err :
99
+ `Failed to start agent due to ${err.name}: ${err.toString()}`));
100
+ }
101
+ *usingClient(use) {
102
+ const { port } = yield* pipe(effunct(this.ensureRunning)(), Effect.mapError(reason => new AgentClientError.ClientError({ reason })));
103
+ return yield* pipe(Effect.scoped(Effect.gen(function* () {
104
+ const client = yield* RpcClient.make(AgentRpcGroup);
105
+ return yield* use(client);
106
+ })), Effect.provide(makeAgentClientLayer(port)), Effect.mapError(e => new AgentClientError.UsageError({ cause: e })));
107
+ }
108
+ }
109
+ //# sourceMappingURL=impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/agent-client/impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Data } from "effect";
2
+ export var AgentClientError;
3
+ (function (AgentClientError) {
4
+ class UsageError extends Data.TaggedError("AgentClientUsageError") {
5
+ }
6
+ AgentClientError.UsageError = UsageError;
7
+ class ClientError extends Data.TaggedError("AgentClientError") {
8
+ }
9
+ AgentClientError.ClientError = ClientError;
10
+ })(AgentClientError || (AgentClientError = {}));
11
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/agent-client/interface.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAI9B,MAAM,KAAW,gBAAgB,CAGhC;AAHD,WAAiB,gBAAgB;IAC/B,MAAa,UAAc,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAwB;KAAG;IAAzF,2BAAU,aAA+E,CAAA;IACtG,MAAa,WAAY,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAA8B;KAAG;IAAxF,4BAAW,cAA6E,CAAA;AACvG,CAAC,EAHgB,gBAAgB,KAAhB,gBAAgB,QAGhC"}
@@ -0,0 +1,124 @@
1
+ import { implementing } from "effective-modules";
2
+ import { cliModules } from "..";
3
+ import { commonModules } from "@/modules/common";
4
+ import { $ } from 'bun';
5
+ import { Effect, Option, pipe } from "effect";
6
+ import { existsSync } from "node:fs";
7
+ import { resolve } from "node:path";
8
+ import { SSH_KEYGEN_CMD_PATH, STANDARD_REMOTE_PREFIX } from "@/common/constants";
9
+ import { Gitmodules } from "./submodule/gitmodules";
10
+ import { readGitState } from "./submodule/git-state";
11
+ import { fixGitConfig, fixModuleDirs, fixIndexGitlinks } from "./submodule/fix";
12
+ import { printSyncState, printFixes } from "./submodule/printer";
13
+ export class GitImpl extends implementing(cliModules.Git).uses(commonModules.OSPlatform, commonModules.SSHConfig) {
14
+ parseOwnerRepo(remote) {
15
+ const sshMatch = remote.match(/^git@[^:]+:([^/]+)\/(.+?)(?:\.git)?$/);
16
+ if (sshMatch)
17
+ return Effect.succeed({ owner: sshMatch[1], repo: sshMatch[2] });
18
+ const httpsMatch = remote.match(/^https?:\/\/[^/]+\/([^/]+)\/(.+?)(?:\.git)?$/);
19
+ if (httpsMatch)
20
+ return Effect.succeed({ owner: httpsMatch[1], repo: httpsMatch[2] });
21
+ return Effect.fail(`Cannot parse owner/repo from remote: ${remote}`);
22
+ }
23
+ *resolveOwnerAndRepo(maybeOwnerAndRepo) {
24
+ if (Option.isSome(maybeOwnerAndRepo)) {
25
+ const parts = maybeOwnerAndRepo.value.split('/');
26
+ const [owner, repo] = parts;
27
+ if (parts.length !== 2 || !owner || !repo)
28
+ return yield* Effect.fail(`Cannot parse remote error: Expected "owner/repo", got "${maybeOwnerAndRepo.value}"`);
29
+ return { owner, repo };
30
+ }
31
+ if (!(yield* this.isGitRepository())) {
32
+ yield* Effect.fail(`not in git repo: Current directory is not a git repository`);
33
+ }
34
+ const remoteOption = yield* this.getRemoteOrigin();
35
+ if (Option.isNone(remoteOption)) {
36
+ return yield* Effect.fail(`no remote origin: No remote.origin.url — pass owner/repo as argument to clone instead`);
37
+ }
38
+ return yield* this.parseOwnerRepo(remoteOption.value);
39
+ }
40
+ *isGitRepository() {
41
+ return yield* pipe(Effect.tryPromise(async () => {
42
+ await $ `git rev-parse --is-inside-work-tree`.quiet();
43
+ return true;
44
+ }), Effect.catchTag("UnknownError", () => Effect.succeed(false)));
45
+ }
46
+ *getRemoteOrigin() {
47
+ return yield* pipe(Effect.tryPromise(async () => {
48
+ return Option.some((await $ `git config --get remote.origin.url`.quiet()).text().trim());
49
+ }), Effect.catchTag("UnknownError", () => Effect.succeed(Option.none())));
50
+ }
51
+ *clone(owner, repo) {
52
+ const result = Bun.spawnSync(['git', 'clone', '--recurse-submodules', `${STANDARD_REMOTE_PREFIX}${owner}/${repo}.git`], { stdout: 'inherit', stderr: 'inherit' });
53
+ if (result.exitCode !== 0)
54
+ return yield* Effect.fail(`git clone failed with exit code ${result.exitCode}`);
55
+ process.chdir(`./${repo}`);
56
+ }
57
+ *setLocalConfig(key, value) {
58
+ yield* Effect.tryPromise({
59
+ try: async () => { await $ `git config --local ${key} ${value}`.quiet(); },
60
+ catch: (e) => `git config ${key}: ${e instanceof Error ? e.message : String(e)}`,
61
+ });
62
+ }
63
+ *configureRepo({ dir, remoteURL, user, pubkeyPath }) {
64
+ yield* Effect.log(`Configuring ${dir}`);
65
+ yield* Effect.tryPromise({
66
+ try: async () => {
67
+ const configs = [
68
+ ['remote.origin.url', remoteURL],
69
+ ['user.name', user.name],
70
+ ['user.email', user.email],
71
+ ['user.signingkey', pubkeyPath],
72
+ ['gpg.format', 'ssh'],
73
+ ['gpg.ssh.program', SSH_KEYGEN_CMD_PATH],
74
+ ['commit.gpgsign', 'true'],
75
+ ['tag.gpgsign', 'true'],
76
+ ];
77
+ for (const [k, v] of configs) {
78
+ const r = Bun.spawnSync(['git', 'config', '--local', k, v], { cwd: dir, stdout: 'pipe', stderr: 'pipe' });
79
+ if (r.exitCode !== 0) {
80
+ const err = new TextDecoder().decode(r.stderr);
81
+ throw new Error(`git config ${k} failed: ${err.trim()}`);
82
+ }
83
+ }
84
+ },
85
+ catch: (e) => e instanceof Error ? e.message : String(e),
86
+ });
87
+ }
88
+ *syncSubmoduleState(repoRoot, topLevelRoot) {
89
+ const gitmodules = yield* Gitmodules.fromRepoRoot(repoRoot);
90
+ if (gitmodules.list.length === 0)
91
+ return gitmodules;
92
+ const submodulePaths = gitmodules.list.map(m => m.path);
93
+ const state = yield* readGitState(repoRoot, submodulePaths);
94
+ printSyncState(gitmodules, state);
95
+ const fixResults = yield* Effect.all([
96
+ fixGitConfig(repoRoot, gitmodules),
97
+ fixModuleDirs(repoRoot, gitmodules, state.moduleDirs, state.orphanModuleDirs, topLevelRoot),
98
+ fixIndexGitlinks(repoRoot, gitmodules, state.index),
99
+ ], { concurrency: "unbounded" });
100
+ printFixes(fixResults.flat());
101
+ return gitmodules;
102
+ }
103
+ *setupRepo(input) {
104
+ yield* this.setupRepoAt(input, input.dir);
105
+ }
106
+ *setupRepoAt(input, topLevelRoot) {
107
+ yield* this.configureRepo(input);
108
+ if (!existsSync(resolve(input.dir, '.gitmodules')))
109
+ return;
110
+ const gitmodules = yield* this.syncSubmoduleState(input.dir, topLevelRoot);
111
+ for (const m of gitmodules.list) {
112
+ const subDir = resolve(input.dir, m.path);
113
+ if (!existsSync(subDir))
114
+ continue;
115
+ yield* this.setupRepoAt({
116
+ dir: subDir,
117
+ remoteURL: m.url,
118
+ user: input.user,
119
+ pubkeyPath: input.pubkeyPath
120
+ }, topLevelRoot);
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/git/impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import {} from "effective-modules";
2
+ import { Option } from "effect";
3
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/git/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,257 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { readFile, writeFile, rename, mkdir, rm } from "node:fs/promises";
3
+ import { resolve, join, dirname, relative } from "node:path";
4
+ import { Effect } from "effect";
5
+ import { resolveGitDir } from "./resolve-git-dir";
6
+ function parseConfigSubmoduleValues(content) {
7
+ const entries = new Map();
8
+ let current = null;
9
+ for (const line of content.split("\n")) {
10
+ const headerMatch = line.match(/^\[submodule "(.+)"\]$/);
11
+ if (headerMatch) {
12
+ current = {};
13
+ entries.set(headerMatch[1], current);
14
+ continue;
15
+ }
16
+ if (!current)
17
+ continue;
18
+ const kvMatch = line.match(/^\s+(\w+)\s*=\s*(.+)$/);
19
+ if (!kvMatch)
20
+ continue;
21
+ const [, key, value] = kvMatch;
22
+ if (key === "url" || key === "path")
23
+ current[key] = value.trim();
24
+ }
25
+ return entries;
26
+ }
27
+ // Drops any stanza whose name isn't a valid submodule, is a stale duplicate, or
28
+ // has url/path values that no longer match .gitmodules — so it can be re-added fresh.
29
+ function removeExtraConfigSubmodules(content, modules) {
30
+ const byName = new Map(modules.list.map((m) => [m.name, m]));
31
+ const existingValues = parseConfigSubmoduleValues(content);
32
+ const staleNames = new Set();
33
+ for (const [name, values] of existingValues) {
34
+ const m = byName.get(name);
35
+ if (!m || values.url !== m.url || values.path !== m.path)
36
+ staleNames.add(name);
37
+ }
38
+ const removed = [];
39
+ const seen = new Set();
40
+ const output = [];
41
+ let dropping = false;
42
+ for (const line of content.split("\n")) {
43
+ const submoduleMatch = line.match(/^\[submodule "(.+)"\]$/);
44
+ if (submoduleMatch) {
45
+ const name = submoduleMatch[1];
46
+ if (!staleNames.has(name) && !seen.has(name)) {
47
+ seen.add(name);
48
+ dropping = false;
49
+ }
50
+ else {
51
+ removed.push(name);
52
+ dropping = true;
53
+ }
54
+ }
55
+ else if (/^\[/.test(line)) {
56
+ dropping = false;
57
+ }
58
+ if (!dropping)
59
+ output.push(line);
60
+ }
61
+ return { result: output.join("\n"), removed };
62
+ }
63
+ async function spawnGit(args, cwd) {
64
+ const proc = Bun.spawn(["git", ...args], { cwd, stdout: "pipe", stderr: "pipe" });
65
+ const code = await proc.exited;
66
+ if (code !== 0) {
67
+ const err = await new Response(proc.stderr).text();
68
+ throw new Error(`git ${args.join(" ")} exited with code ${code}\n${err.trim()}`);
69
+ }
70
+ }
71
+ export function fixGitConfig(repoRoot, modules) {
72
+ return Effect.tryPromise({
73
+ try: async () => {
74
+ const gitDir = await resolveGitDir(repoRoot);
75
+ const configPath = resolve(gitDir, "config");
76
+ const content = await readFile(configPath, "utf8");
77
+ const { result: afterRemoval, removed } = removeExtraConfigSubmodules(content, modules);
78
+ const existingNames = new Set([...afterRemoval.matchAll(/^\[submodule "(.+)"\]$/gm)].map((m) => m[1]));
79
+ const missing = modules.list.filter((m) => !existingNames.has(m.name));
80
+ let result = afterRemoval;
81
+ for (const m of missing) {
82
+ if (!result.endsWith("\n"))
83
+ result += "\n";
84
+ result += `[submodule "${m.name}"]\n\tactive = true\n\turl = ${m.url}\n\tpath = ${m.path}\n`;
85
+ }
86
+ if (removed.length === 0 && missing.length === 0)
87
+ return [];
88
+ await writeFile(configPath, result, "utf8");
89
+ return [
90
+ ...removed.map((name) => ({ location: [".git", "config", name], action: "deleted" })),
91
+ ...missing.map((m) => ({ location: [".git", "config", m.name], action: "synced" })),
92
+ ];
93
+ },
94
+ catch: (e) => e instanceof Error ? e.message : String(e),
95
+ });
96
+ }
97
+ const GIT_MODULES_MARKER = ".git/modules/";
98
+ // A stale redirect's leading "../" prefix can be wrong after a path rename, but the
99
+ // suffix starting at ".git/modules/" always describes a location under the single
100
+ // top-level .git, at any nesting depth — so anchor on that marker instead of trusting
101
+ // the relative resolution.
102
+ function recoverStaleGitDirTarget(redirectContent, topLevelRoot) {
103
+ const match = redirectContent.match(/^gitdir:\s*(.+)$/m);
104
+ if (!match)
105
+ return undefined;
106
+ const idx = match[1].indexOf(GIT_MODULES_MARKER);
107
+ if (idx === -1)
108
+ return undefined;
109
+ return resolve(topLevelRoot, match[1].slice(idx).trim());
110
+ }
111
+ // Moves existing git data into moduleGitDir instead of abandoning it, whether it's a
112
+ // standalone clone's literal .git directory, or a redirect file (even a stale one
113
+ // left over from a path rename) pointing at git data that still exists.
114
+ async function migrateExistingGitDir(workingTreeDir, moduleGitDir, topLevelRoot) {
115
+ const dotGit = join(workingTreeDir, ".git");
116
+ if (!existsSync(dotGit))
117
+ return false;
118
+ if (statSync(dotGit).isDirectory()) {
119
+ await mkdir(dirname(moduleGitDir), { recursive: true });
120
+ await rename(dotGit, moduleGitDir);
121
+ return true;
122
+ }
123
+ const content = await readFile(dotGit, "utf8");
124
+ const target = recoverStaleGitDirTarget(content, topLevelRoot);
125
+ if (!target || target === moduleGitDir || !existsSync(target))
126
+ return false;
127
+ await mkdir(dirname(moduleGitDir), { recursive: true });
128
+ await rename(target, moduleGitDir);
129
+ return true;
130
+ }
131
+ export function fixModuleDirs(repoRoot, modules, moduleDirs, orphanModuleDirs, topLevelRoot) {
132
+ return Effect.tryPromise({
133
+ try: async () => {
134
+ const fixes = [];
135
+ const modulesRoot = resolve(await resolveGitDir(repoRoot), "modules");
136
+ // Establish each module's git dir (migrating existing data if any exists
137
+ // anywhere) before the orphan cleanup below runs, so nothing real gets deleted
138
+ // out from under a path rename.
139
+ for (const m of modules.list) {
140
+ const workingTreeDir = resolve(repoRoot, m.path);
141
+ const moduleGitDir = join(modulesRoot, m.path);
142
+ if (!existsSync(workingTreeDir))
143
+ continue;
144
+ const alreadyEstablished = existsSync(moduleGitDir);
145
+ let freshlyCloned = false;
146
+ if (!alreadyEstablished) {
147
+ const migrated = await migrateExistingGitDir(workingTreeDir, moduleGitDir, topLevelRoot);
148
+ if (migrated) {
149
+ fixes.push({ location: [".git", "modules", ...m.path.split("/")], action: "synced", detail: "migrated" });
150
+ }
151
+ else {
152
+ await mkdir(dirname(moduleGitDir), { recursive: true });
153
+ await spawnGit(["clone", "--bare", m.url, moduleGitDir], repoRoot);
154
+ fixes.push({ location: [".git", "modules", ...m.path.split("/")], action: "synced", detail: "initialized" });
155
+ freshlyCloned = true;
156
+ }
157
+ }
158
+ if (freshlyCloned) {
159
+ const configFile = join(moduleGitDir, "config");
160
+ const worktree = relative(moduleGitDir, workingTreeDir);
161
+ await spawnGit(["config", "-f", configFile, "core.bare", "false"], repoRoot);
162
+ await spawnGit(["config", "-f", configFile, "core.worktree", worktree], repoRoot);
163
+ }
164
+ // A bare clone (whether just made above, or left over from a prior buggy
165
+ // run) never gets an index — populate it from HEAD whenever it's missing,
166
+ // not only right after we ourselves created it.
167
+ if (!existsSync(join(moduleGitDir, "index"))) {
168
+ const headCheck = Bun.spawn(["git", "--git-dir", moduleGitDir, "rev-parse", "--verify", "HEAD"], { stdout: "ignore", stderr: "ignore" });
169
+ if ((await headCheck.exited) !== 0)
170
+ await spawnGit(["--git-dir", moduleGitDir, "fetch", "origin"], repoRoot);
171
+ await spawnGit(["--git-dir", moduleGitDir, "read-tree", "HEAD"], repoRoot);
172
+ fixes.push({ location: [".git", "modules", ...m.path.split("/")], action: "synced", detail: "populated index" });
173
+ }
174
+ // Always re-point the working tree's .git redirect — never assume an
175
+ // existing file is already correct.
176
+ const dotGit = join(workingTreeDir, ".git");
177
+ const rel = relative(workingTreeDir, moduleGitDir);
178
+ const desired = `gitdir: ${rel}\n`;
179
+ const current = existsSync(dotGit) && !statSync(dotGit).isDirectory()
180
+ ? await readFile(dotGit, "utf8")
181
+ : undefined;
182
+ if (current !== desired) {
183
+ await writeFile(dotGit, desired, "utf8");
184
+ fixes.push({ location: [...m.path.split("/"), ".git"], action: "synced" });
185
+ }
186
+ }
187
+ const gmByPath = new Map(modules.list.map((m) => [m.path, m]));
188
+ for (const d of moduleDirs) {
189
+ const gm = gmByPath.get(d.relativePath);
190
+ if (!gm && existsSync(join(modulesRoot, d.relativePath))) {
191
+ await rm(join(modulesRoot, d.relativePath), { recursive: true, force: true });
192
+ fixes.push({ location: [".git", "modules", ...d.relativePath.split("/")], action: "deleted" });
193
+ }
194
+ }
195
+ for (const rel of orphanModuleDirs) {
196
+ if (existsSync(join(modulesRoot, rel))) {
197
+ await rm(join(modulesRoot, rel), { recursive: true, force: true });
198
+ fixes.push({ location: [".git", "modules", ...rel.split("/")], action: "deleted" });
199
+ }
200
+ }
201
+ for (const m of modules.list) {
202
+ const moduleGitDir = join(modulesRoot, m.path);
203
+ if (!existsSync(moduleGitDir))
204
+ continue;
205
+ const configFile = join(moduleGitDir, "config");
206
+ const readConfig = (key) => Bun.spawn(["git", "config", "-f", configFile, key], { cwd: repoRoot, stdout: "pipe", stderr: "pipe" });
207
+ const [currentUrl, currentWorktree] = await Promise.all([
208
+ new Response(readConfig("remote.origin.url").stdout).text().then(t => t.trim()),
209
+ new Response(readConfig("core.worktree").stdout).text().then(t => t.trim()),
210
+ ]);
211
+ const worktree = relative(moduleGitDir, resolve(repoRoot, m.path));
212
+ if (currentUrl !== m.url) {
213
+ await spawnGit(["config", "-f", configFile, "remote.origin.url", m.url], repoRoot);
214
+ fixes.push({ location: [".git", "modules", ...m.path.split("/"), "config"], action: "synced", detail: "remote.origin.url" });
215
+ }
216
+ if (currentWorktree !== worktree) {
217
+ await spawnGit(["config", "-f", configFile, "core.worktree", worktree], repoRoot);
218
+ fixes.push({ location: [".git", "modules", ...m.path.split("/"), "config"], action: "synced", detail: "core.worktree" });
219
+ }
220
+ }
221
+ return fixes;
222
+ },
223
+ catch: (e) => e instanceof Error ? e.message : String(e),
224
+ });
225
+ }
226
+ export function fixIndexGitlinks(repoRoot, modules, currentIndex) {
227
+ return Effect.tryPromise({
228
+ try: async () => {
229
+ const currentShas = new Map(currentIndex.map((e) => [e.path, e.commit]));
230
+ const validPaths = new Set(modules.list.map((m) => m.path));
231
+ const fixes = [];
232
+ for (const entry of currentIndex) {
233
+ if (!validPaths.has(entry.path)) {
234
+ await spawnGit(["update-index", "--force-remove", entry.path], repoRoot);
235
+ fixes.push({ location: [".git", "index"], action: "deleted", detail: entry.path });
236
+ }
237
+ }
238
+ for (const m of modules.list) {
239
+ const workingTree = resolve(repoRoot, m.path);
240
+ if (!existsSync(workingTree))
241
+ continue;
242
+ const shaProc = Bun.spawn(["git", "rev-parse", "HEAD"], { cwd: workingTree, stdout: "pipe", stderr: "pipe" });
243
+ const sha = (await new Response(shaProc.stdout).text()).trim();
244
+ if (!/^[0-9a-f]{40}$/.test(sha))
245
+ continue;
246
+ const current = currentShas.get(m.path);
247
+ await spawnGit(["update-index", "--add", "--cacheinfo", `160000,${sha},${m.path}`], repoRoot);
248
+ if (current !== sha) {
249
+ fixes.push({ location: [".git", "index"], action: "synced", detail: `${m.path}: ${sha.slice(0, 8)}` });
250
+ }
251
+ }
252
+ return fixes;
253
+ },
254
+ catch: (e) => e instanceof Error ? e.message : String(e),
255
+ });
256
+ }
257
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../../../../../../src/modules/cli/git/submodule/fix.ts"],"names":[],"mappings":"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"}