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

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 (202) hide show
  1. package/dist/commands/git/hosts.js +18 -0
  2. package/dist/commands/git/hosts.js.map +1 -0
  3. package/dist/commands/git/index.js +8 -0
  4. package/dist/commands/git/index.js.map +1 -0
  5. package/dist/commands/git/setup.js +145 -0
  6. package/dist/commands/git/setup.js.map +1 -0
  7. package/dist/commands/index.js +13 -0
  8. package/dist/commands/index.js.map +1 -0
  9. package/dist/commands/npm/index.js +7 -0
  10. package/dist/commands/npm/index.js.map +1 -0
  11. package/dist/commands/npm/setup/git-remote.js +66 -0
  12. package/dist/commands/npm/setup/git-remote.js.map +1 -0
  13. package/dist/commands/npm/setup/index.js +168 -0
  14. package/dist/commands/npm/setup/index.js.map +1 -0
  15. package/dist/commands/npm/setup/npm-auth.js +62 -0
  16. package/dist/commands/npm/setup/npm-auth.js.map +1 -0
  17. package/dist/commands/npm/setup/package-json-validate.js +47 -0
  18. package/dist/commands/npm/setup/package-json-validate.js.map +1 -0
  19. package/dist/commands/npm/setup/package-registry.js +20 -0
  20. package/dist/commands/npm/setup/package-registry.js.map +1 -0
  21. package/dist/commands/npm/setup/setup.test.js +95 -0
  22. package/dist/commands/npm/setup/setup.test.js.map +1 -0
  23. package/dist/commands/npm/setup/trusted-publishing.js +84 -0
  24. package/dist/commands/npm/setup/trusted-publishing.js.map +1 -0
  25. package/dist/commands/npm/setup/workflow.js +19 -0
  26. package/dist/commands/npm/setup/workflow.js.map +1 -0
  27. package/dist/commands/ssh/get-sk-credential.js +104 -0
  28. package/dist/commands/ssh/get-sk-credential.js.map +1 -0
  29. package/dist/commands/ssh/index.js +7 -0
  30. package/dist/commands/ssh/index.js.map +1 -0
  31. package/dist/commands/upgrade.js +81 -0
  32. package/dist/commands/upgrade.js.map +1 -0
  33. package/dist/common/command.js +15 -0
  34. package/dist/common/command.js.map +1 -0
  35. package/dist/common/constants.js +24 -0
  36. package/dist/common/constants.js.map +1 -0
  37. package/dist/common/effective-modules-extensions.js +13 -0
  38. package/dist/common/effective-modules-extensions.js.map +1 -0
  39. package/dist/common/log.js +4 -0
  40. package/dist/common/log.js.map +1 -0
  41. package/dist/common/render-caller-tree.js +20 -0
  42. package/dist/common/render-caller-tree.js.map +1 -0
  43. package/dist/entrypoints/ozy-signing-agent.js +48 -0
  44. package/dist/entrypoints/ozy-signing-agent.js.map +1 -0
  45. package/dist/entrypoints/ozy-ssh-keygen.js +9 -0
  46. package/dist/entrypoints/ozy-ssh-keygen.js.map +1 -0
  47. package/dist/entrypoints/ozy-virtual-security-key.js +18 -0
  48. package/dist/entrypoints/ozy-virtual-security-key.js.map +1 -0
  49. package/dist/entrypoints/ozy.js +3 -0
  50. package/dist/entrypoints/ozy.js.map +1 -0
  51. package/dist/index.js +2 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/internal/thing.js +4 -0
  54. package/dist/internal/thing.js.map +1 -0
  55. package/dist/modules/cli/agent-client/impl.js +109 -0
  56. package/dist/modules/cli/agent-client/impl.js.map +1 -0
  57. package/dist/modules/cli/agent-client/interface.js +11 -0
  58. package/dist/modules/cli/agent-client/interface.js.map +1 -0
  59. package/dist/modules/cli/git/impl.js +124 -0
  60. package/dist/modules/cli/git/impl.js.map +1 -0
  61. package/dist/modules/cli/git/interface.js +3 -0
  62. package/dist/modules/cli/git/interface.js.map +1 -0
  63. package/dist/modules/cli/git/submodule/fix.js +257 -0
  64. package/dist/modules/cli/git/submodule/fix.js.map +1 -0
  65. package/dist/modules/cli/git/submodule/git-state.js +154 -0
  66. package/dist/modules/cli/git/submodule/git-state.js.map +1 -0
  67. package/dist/modules/cli/git/submodule/gitmodules.js +113 -0
  68. package/dist/modules/cli/git/submodule/gitmodules.js.map +1 -0
  69. package/dist/modules/cli/git/submodule/printer.js +232 -0
  70. package/dist/modules/cli/git/submodule/printer.js.map +1 -0
  71. package/dist/modules/cli/git/submodule/resolve-git-dir.js +16 -0
  72. package/dist/modules/cli/git/submodule/resolve-git-dir.js.map +1 -0
  73. package/dist/modules/cli/github/impl.js +137 -0
  74. package/dist/modules/cli/github/impl.js.map +1 -0
  75. package/dist/modules/cli/github/interface.js +2 -0
  76. package/dist/modules/cli/github/interface.js.map +1 -0
  77. package/dist/modules/cli/index.js +9 -0
  78. package/dist/modules/cli/index.js.map +1 -0
  79. package/dist/modules/common/crypto/impl.js +133 -0
  80. package/dist/modules/common/crypto/impl.js.map +1 -0
  81. package/dist/modules/common/crypto/interface.js +2 -0
  82. package/dist/modules/common/crypto/interface.js.map +1 -0
  83. package/dist/modules/common/index.js +10 -0
  84. package/dist/modules/common/index.js.map +1 -0
  85. package/dist/modules/common/kep-map-store/impl.js +42 -0
  86. package/dist/modules/common/kep-map-store/impl.js.map +1 -0
  87. package/dist/modules/common/kep-map-store/interface.js +2 -0
  88. package/dist/modules/common/kep-map-store/interface.js.map +1 -0
  89. package/dist/modules/common/os-platform/caller-info.js +132 -0
  90. package/dist/modules/common/os-platform/caller-info.js.map +1 -0
  91. package/dist/modules/common/os-platform/impl.js +87 -0
  92. package/dist/modules/common/os-platform/impl.js.map +1 -0
  93. package/dist/modules/common/os-platform/interface.js +2 -0
  94. package/dist/modules/common/os-platform/interface.js.map +1 -0
  95. package/dist/modules/common/os-platform/virtual-hid/index.js +12 -0
  96. package/dist/modules/common/os-platform/virtual-hid/index.js.map +1 -0
  97. package/dist/modules/common/os-platform/virtual-hid/linux.js +5 -0
  98. package/dist/modules/common/os-platform/virtual-hid/linux.js.map +1 -0
  99. package/dist/modules/common/os-platform/virtual-hid/mac.js +119 -0
  100. package/dist/modules/common/os-platform/virtual-hid/mac.js.map +1 -0
  101. package/dist/modules/common/os-platform/virtual-hid/windows.js +5 -0
  102. package/dist/modules/common/os-platform/virtual-hid/windows.js.map +1 -0
  103. package/dist/modules/common/ssh-config/impl.js +116 -0
  104. package/dist/modules/common/ssh-config/impl.js.map +1 -0
  105. package/dist/modules/common/ssh-config/interface.js +10 -0
  106. package/dist/modules/common/ssh-config/interface.js.map +1 -0
  107. package/dist/modules/ssh-agent/index.js +8 -0
  108. package/dist/modules/ssh-agent/index.js.map +1 -0
  109. package/dist/modules/ssh-agent/session/impl.js +265 -0
  110. package/dist/modules/ssh-agent/session/impl.js.map +1 -0
  111. package/dist/modules/ssh-agent/session/interface-rpc.js +20 -0
  112. package/dist/modules/ssh-agent/session/interface-rpc.js.map +1 -0
  113. package/dist/modules/ssh-agent/session/interface.js +32 -0
  114. package/dist/modules/ssh-agent/session/interface.js.map +1 -0
  115. package/dist/modules/ssh-agent/session/passkey-prf-page.js +204 -0
  116. package/dist/modules/ssh-agent/session/passkey-prf-page.js.map +1 -0
  117. package/dist/modules/ssh-agent/session/prf-flow.js +103 -0
  118. package/dist/modules/ssh-agent/session/prf-flow.js.map +1 -0
  119. package/dist/modules/ssh-agent/ssh-agent/impl.js +117 -0
  120. package/dist/modules/ssh-agent/ssh-agent/impl.js.map +1 -0
  121. package/dist/modules/ssh-agent/ssh-agent/interface.js +2 -0
  122. package/dist/modules/ssh-agent/ssh-agent/interface.js.map +1 -0
  123. package/dist/scripts/build.js +460 -0
  124. package/dist/scripts/build.js.map +1 -0
  125. package/dist/scripts/check-npm-version.js +8 -0
  126. package/dist/scripts/check-npm-version.js.map +1 -0
  127. package/dist/scripts/kill-existing-agent.js +21 -0
  128. package/dist/scripts/kill-existing-agent.js.map +1 -0
  129. package/dist/scripts/publish.js +46 -0
  130. package/dist/scripts/publish.js.map +1 -0
  131. package/multi-call.js +85 -0
  132. package/package.json +55 -11
  133. package/src/commands/git/hosts.ts +20 -0
  134. package/src/commands/git/index.ts +9 -0
  135. package/src/commands/git/setup.ts +182 -0
  136. package/src/commands/index.ts +15 -0
  137. package/src/commands/npm/index.ts +8 -0
  138. package/src/commands/npm/setup/git-remote.ts +78 -0
  139. package/src/commands/npm/setup/index.ts +189 -0
  140. package/src/commands/npm/setup/npm-auth.ts +58 -0
  141. package/src/commands/npm/setup/package-json-validate.ts +68 -0
  142. package/src/commands/npm/setup/package-registry.ts +24 -0
  143. package/src/commands/npm/setup/publish-workflow.yml +35 -0
  144. package/src/commands/npm/setup/setup.test.ts +117 -0
  145. package/src/commands/npm/setup/trusted-publishing.ts +106 -0
  146. package/src/commands/npm/setup/workflow.ts +20 -0
  147. package/src/commands/ssh/get-sk-credential.ts +110 -0
  148. package/src/commands/ssh/index.ts +8 -0
  149. package/src/commands/upgrade.ts +90 -0
  150. package/src/common/command.ts +16 -0
  151. package/src/common/constants.ts +24 -0
  152. package/src/common/effective-modules-extensions.ts +24 -0
  153. package/src/common/log.ts +3 -0
  154. package/src/common/render-caller-tree.ts +22 -0
  155. package/src/entrypoints/ozy-signing-agent.ts +48 -0
  156. package/src/entrypoints/ozy-ssh-keygen.ts +10 -0
  157. package/src/entrypoints/ozy-virtual-security-key.ts +21 -0
  158. package/src/entrypoints/ozy.ts +2 -0
  159. package/src/index.ts +1 -0
  160. package/src/internal/thing.ts +3 -0
  161. package/src/modules/cli/agent-client/impl.ts +152 -0
  162. package/src/modules/cli/agent-client/interface.ts +17 -0
  163. package/src/modules/cli/git/impl.ts +133 -0
  164. package/src/modules/cli/git/interface.ts +23 -0
  165. package/src/modules/cli/git/submodule/fix.ts +298 -0
  166. package/src/modules/cli/git/submodule/git-state.ts +217 -0
  167. package/src/modules/cli/git/submodule/gitmodules.ts +126 -0
  168. package/src/modules/cli/git/submodule/printer.ts +256 -0
  169. package/src/modules/cli/git/submodule/resolve-git-dir.ts +14 -0
  170. package/src/modules/cli/github/impl.ts +169 -0
  171. package/src/modules/cli/github/interface.ts +29 -0
  172. package/src/modules/cli/index.ts +16 -0
  173. package/src/modules/common/crypto/impl.ts +173 -0
  174. package/src/modules/common/crypto/interface.ts +20 -0
  175. package/src/modules/common/index.ts +19 -0
  176. package/src/modules/common/kep-map-store/impl.ts +47 -0
  177. package/src/modules/common/kep-map-store/interface.ts +9 -0
  178. package/src/modules/common/os-platform/caller-info.ts +152 -0
  179. package/src/modules/common/os-platform/impl.ts +86 -0
  180. package/src/modules/common/os-platform/interface.ts +16 -0
  181. package/src/modules/common/os-platform/virtual-hid/index.ts +12 -0
  182. package/src/modules/common/os-platform/virtual-hid/linux.ts +7 -0
  183. package/src/modules/common/os-platform/virtual-hid/mac.ts +150 -0
  184. package/src/modules/common/os-platform/virtual-hid/windows.ts +7 -0
  185. package/src/modules/common/ssh-config/impl.ts +130 -0
  186. package/src/modules/common/ssh-config/interface.ts +33 -0
  187. package/src/modules/ssh-agent/index.ts +13 -0
  188. package/src/modules/ssh-agent/session/agent-notes.md +210 -0
  189. package/src/modules/ssh-agent/session/design.md +2 -0
  190. package/src/modules/ssh-agent/session/html-refactor.md +23 -0
  191. package/src/modules/ssh-agent/session/impl.ts +328 -0
  192. package/src/modules/ssh-agent/session/interface-rpc.ts +24 -0
  193. package/src/modules/ssh-agent/session/interface.ts +62 -0
  194. package/src/modules/ssh-agent/session/passkey-prf-page.ts +224 -0
  195. package/src/modules/ssh-agent/session/prf-flow.ts +152 -0
  196. package/src/modules/ssh-agent/ssh-agent/impl.ts +136 -0
  197. package/src/modules/ssh-agent/ssh-agent/interface.ts +9 -0
  198. package/src/scripts/build.ts +543 -0
  199. package/src/scripts/check-npm-version.ts +7 -0
  200. package/src/scripts/kill-existing-agent.ts +22 -0
  201. package/src/scripts/publish.ts +47 -0
  202. package/multi-call-binary +0 -0
@@ -0,0 +1,18 @@
1
+ import { Effect } from "effect";
2
+ import { makeCommand } from "@/common/command";
3
+ import { log } from "@/common/log";
4
+ import { commonModules } from "@/modules/common";
5
+ import { SSHConfigImpl } from "@/modules/common/ssh-config/impl";
6
+ export const hosts = makeCommand('hosts', 'show all configured github.com SSH hosts', () => Effect.gen(function* () {
7
+ const sshConfig = yield* commonModules.SSHConfig;
8
+ const config = yield* sshConfig.getSSHConfig();
9
+ const gitHosts = [];
10
+ for (const host in config) {
11
+ if (config[host].HostName === 'github.com') {
12
+ gitHosts.push(host);
13
+ }
14
+ }
15
+ log('Available hosts:');
16
+ gitHosts.forEach(host => { log(` - ${host}`); });
17
+ }).pipe(Effect.provide(SSHConfigImpl.Layer)));
18
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../../../../../src/commands/git/hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,0CAA0C,EAAE,GAAG,EAAE,CACzF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,CAAE,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAC7C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ import { setup } from './setup';
3
+ import { hosts } from './hosts';
4
+ export const git = new Command('git')
5
+ .summary('setup git in repo for verified commits');
6
+ [setup, hosts]
7
+ .forEach(cmd => { git.addCommand(cmd); });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/commands/git/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KAClC,OAAO,CAAC,wCAAwC,CAAC,CAAC;AAErD,CAAC,KAAK,EAAE,KAAK,CAAC;KACX,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,145 @@
1
+ import { Command } from 'commander';
2
+ import { Effect, Layer, Option, pipe } from 'effect';
3
+ import { log } from '@/common/log';
4
+ import { cliModules } from '@/modules/cli';
5
+ import { commonModules, CommonModules } from '@/modules/common';
6
+ import { effunct } from 'effective-modules';
7
+ import { GitImpl } from '@/modules/cli/git/impl';
8
+ import { GitHubImpl } from '@/modules/cli/github/impl';
9
+ import { AgentClientImpl } from '@/modules/cli/agent-client/impl';
10
+ import { OSPlatformImpl } from '@/modules/common/os-platform/impl';
11
+ import { SSHConfigImpl } from '@/modules/common/ssh-config/impl';
12
+ import { AGENT_SOCK_FILE_PATH, FUTURE_TOOL_NAME, STANDARD_REMOTE_PREFIX } from '../../common/constants';
13
+ import { CredentialId } from '@/modules/common/crypto/impl';
14
+ import { BunFileSystem } from "@effect/platform-bun";
15
+ const GITHUB_CLIENT_ID = 'Ov23liKYxk1Ag7SsNhbP';
16
+ const GITHUB_CLIENT_SECRET = 'e2901fbe93c591e7a53a903e70490ff87e998159';
17
+ const OAUTH_SCOPES = 'read:user user:email write:ssh_signing_key write:public_key';
18
+ const KEY_PREFIX = `${FUTURE_TOOL_NAME}-`;
19
+ function parseCredentialIdFromTitle(title) {
20
+ const match = title.match(/\(([^)]+)\)$/);
21
+ if (!match)
22
+ return Option.none();
23
+ return Option.some(match[1]);
24
+ }
25
+ function baseKey(pubkey) {
26
+ return pubkey.split(' ').slice(0, 2).join(' ');
27
+ }
28
+ export var GitSetupError;
29
+ (function (GitSetupError) {
30
+ GitSetupError["NotInGitRepositoryError"] = "NotInGitRepositoryError";
31
+ GitSetupError["NoRemoteOriginError"] = "NoRemoteOriginError";
32
+ GitSetupError["OAuthFailedError"] = "OAuthFailedError";
33
+ GitSetupError["GitHubUserFetchFailedError"] = "GitHubUserFetchFailedError";
34
+ GitSetupError["RepoAccessDeniedError"] = "RepoAccessDeniedError";
35
+ GitSetupError["MultipleJiveSigningKeysError"] = "MultipleJiveSigningKeysError";
36
+ GitSetupError["MultipleJiveAuthnKeysError"] = "MultipleJiveAuthnKeysError";
37
+ GitSetupError["MissingCredentialIdError"] = "MissingCredentialIdError";
38
+ GitSetupError["SigningAuthnKeyMismatchError"] = "SigningAuthnKeyMismatchError";
39
+ GitSetupError["AgentStartFailedError"] = "AgentStartFailedError";
40
+ GitSetupError["AgentProcedureFailedError"] = "AgentProcedureFailedError";
41
+ GitSetupError["GitCloneFailedError"] = "GitCloneFailedError";
42
+ GitSetupError["GitConfigFailedError"] = "GitConfigFailedError";
43
+ })(GitSetupError || (GitSetupError = {}));
44
+ function* gitSetup(ownerRepoArg) {
45
+ const git = yield* cliModules.Git;
46
+ const github = yield* cliModules.GitHub;
47
+ const agentClient = yield* cliModules.AgentClient;
48
+ const sshConfig = yield* commonModules.SSHConfig;
49
+ const isCloneMode = ownerRepoArg !== undefined;
50
+ // 1. Parse owner/repo
51
+ const { owner, repo } = yield* git.resolveOwnerAndRepo(Option.fromNullishOr(ownerRepoArg));
52
+ log(`Setting up ${owner}/${repo}`);
53
+ // 2. GitHub OAuth
54
+ const token = yield* github.authorize(GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, OAUTH_SCOPES);
55
+ log('✓ Authorized with GitHub');
56
+ // 3. Fetch user info
57
+ const { login, email } = yield* github.getUser(token);
58
+ const gitUser = { name: login, email: email };
59
+ log(` Logged in as: ${gitUser.name} <${gitUser.email}>`);
60
+ // 4. Check GitHub signing keys for <tool name>: prefix
61
+ const signingKeys = yield* github.getSigningKeys(token);
62
+ const toolKeys = signingKeys.filter(k => k.title.startsWith(KEY_PREFIX));
63
+ if (toolKeys.length > 1)
64
+ return yield* Effect.fail(`${GitSetupError.MultipleJiveSigningKeysError}: Found ${toolKeys.length} signing keys with "${KEY_PREFIX}" prefix — expected at most 1`);
65
+ let maybeKey = Option.none();
66
+ if (toolKeys[0]) {
67
+ const credentialId = parseCredentialIdFromTitle(toolKeys[0].title);
68
+ if (Option.isNone(credentialId))
69
+ return yield* Effect.fail(`${GitSetupError.MissingCredentialIdError}: signing key title "${toolKeys[0].title}" has no credentialId`);
70
+ maybeKey = Option.some({ credentialId: credentialId.value, pubkey: baseKey(toolKeys[0].key) });
71
+ }
72
+ // 5. Check authn keys too — must match signing key if both present.
73
+ const authnKeys = yield* github.getAuthnKeys(token);
74
+ const toolAuthnKeys = authnKeys.filter(k => k.title.startsWith(KEY_PREFIX));
75
+ if (toolAuthnKeys.length > 1)
76
+ return yield* Effect.fail(`${GitSetupError.MultipleJiveAuthnKeysError}: Found ${toolAuthnKeys.length} authn keys with "${KEY_PREFIX}" prefix — expected at most 1`);
77
+ let maybeAuthnKey = Option.none();
78
+ if (toolAuthnKeys[0]) {
79
+ const credentialId = parseCredentialIdFromTitle(toolAuthnKeys[0].title);
80
+ if (Option.isNone(credentialId))
81
+ return yield* Effect.fail(`${GitSetupError.MissingCredentialIdError}: authn key title "${toolAuthnKeys[0].title}" has no credentialId`);
82
+ maybeAuthnKey = Option.some({ credentialId: credentialId.value, pubkey: baseKey(toolAuthnKeys[0].key) });
83
+ }
84
+ if (Option.isSome(maybeKey) && Option.isSome(maybeAuthnKey) && maybeKey.value.pubkey !== maybeAuthnKey.value.pubkey)
85
+ return yield* Effect.fail(`${GitSetupError.SigningAuthnKeyMismatchError}: signing key and authn key pubkeys don't match — GitHub account is in an inconsistent state`);
86
+ // 6. Call agent to get/create/verify key (starts agent if not running)
87
+ const { credentialId, pubkey } = yield* pipe(Effect.gen(() => agentClient.usingClient(function* (client) {
88
+ return yield* pipe(client.Setup({
89
+ pubkey: Option.map(maybeKey, k => k.pubkey),
90
+ credentialId: Option.map(maybeKey, k => k.credentialId),
91
+ username: login,
92
+ }), Effect.mapError(e => `${GitSetupError.AgentProcedureFailedError}: ${String(e)}`));
93
+ })), Effect.catchTag("AgentClientError", err => Effect.fail(err.reason)), Effect.catchTag("AgentClientUsageError", err => Effect.fail(err.cause)));
94
+ const credentialFriendlyName = new CredentialId(credentialId).humanReadableName;
95
+ const keyTitle = `${credentialFriendlyName} (${credentialId})`;
96
+ // 8. Register signing key on GitHub if not already present
97
+ if (Option.isNone(maybeKey)) {
98
+ yield* github.addSigningKey(token, keyTitle, pubkey);
99
+ log(`✓ Registered GitHub signing key: ${keyTitle}`);
100
+ }
101
+ // 9. Register key as authn key on GitHub account if not already present
102
+ if (Option.isNone(maybeAuthnKey)) {
103
+ yield* github.addAuthnKey(token, keyTitle, pubkey);
104
+ log(`✓ Registered authn key on GitHub account`);
105
+ }
106
+ // 10. Write ssh config (pubkey file written by agent via KeyMapStore.addKey)
107
+ const pubkeyPath = sshConfig.getPubkeyPath(credentialFriendlyName);
108
+ yield* sshConfig.writeHost({
109
+ section: {
110
+ HostName: "github.com",
111
+ User: "git",
112
+ IdentityFile: pubkeyPath,
113
+ IdentitiesOnly: "yes",
114
+ IdentityAgent: AGENT_SOCK_FILE_PATH,
115
+ },
116
+ });
117
+ // 11. Clone if in clone mode
118
+ if (isCloneMode) {
119
+ yield* git.clone(owner, repo);
120
+ log(`✓ Cloned into ${repo}/`);
121
+ }
122
+ // 12. Set repo config plus any submodules' config
123
+ log('\nSetting git config:');
124
+ yield* git.setupRepo({
125
+ dir: process.cwd(),
126
+ remoteURL: `${STANDARD_REMOTE_PREFIX}${owner}/${repo}.git`,
127
+ user: gitUser,
128
+ pubkeyPath,
129
+ });
130
+ log(`\n✓ Setup complete for ${owner}/${repo}`);
131
+ }
132
+ const layerLive = pipe(GitImpl.Layer, Layer.provideMerge(GitHubImpl.Layer), Layer.provideMerge(AgentClientImpl.Layer), Layer.provideMerge(OSPlatformImpl.Layer), Layer.provideMerge(SSHConfigImpl.Layer), Layer.provideMerge(BunFileSystem.layer));
133
+ export const setup = new Command('setup')
134
+ .description('setup verified git commits for current repo')
135
+ .argument('[owner/repo]', 'GitHub repo to clone and set up (omit if already in a repo with a remote)')
136
+ .action(async (ownerRepo) => {
137
+ function* program() {
138
+ yield* pipe(effunct(gitSetup)(ownerRepo), Effect.provide(layerLive), Effect.catch(err => Effect.gen(function* () {
139
+ log(`✗ ${err}`);
140
+ })));
141
+ }
142
+ await Effect.runPromise(Effect.gen(program));
143
+ process.exit();
144
+ });
145
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../../../src/commands/git/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { program } from 'commander';
2
+ import { git } from './git';
3
+ import { npm } from './npm';
4
+ import { upgrade } from './upgrade';
5
+ import { ssh } from "./ssh";
6
+ import { CLI_CMD_NAME, CURRENT_VERSION } from '@/common/constants';
7
+ program.name(CLI_CMD_NAME).version(CURRENT_VERSION);
8
+ [git, npm, ssh, upgrade]
9
+ .forEach(cmd => { program.addCommand(cmd); });
10
+ program.parse();
11
+ if (process.argv.length <= 2)
12
+ program.help();
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAEpD,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;KACrB,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC;AAE/C,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;IAAE,OAAO,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ import { setup } from './setup';
3
+ export const npm = new Command('npm')
4
+ .summary('npm package management utilities');
5
+ [setup]
6
+ .forEach(cmd => { npm.addCommand(cmd); });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/commands/npm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KAClC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAE/C,CAAC,KAAK,CAAC;KACJ,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { $ } from 'bun';
2
+ import { Effect, Option } from 'effect';
3
+ // Handles https://github.com/owner/repo.git, git@github.com:owner/repo.git,
4
+ // and SSH aliases like github-ozyman42:owner/repo.git
5
+ export function parseGithubOwnerRepo(url) {
6
+ const https = url.match(/github\.com[/:]([^/]+)\/([^/]+?)(?:\.git)?$/);
7
+ if (https)
8
+ return Option.some({ owner: https[1], repo: https[2] });
9
+ const alias = url.match(/^[^:]+:([^/]+)\/([^/]+?)(?:\.git)?$/);
10
+ if (alias)
11
+ return Option.some({ owner: alias[1], repo: alias[2] });
12
+ return Option.none();
13
+ }
14
+ async function viewRepo(nameWithOwner) {
15
+ const view = await $ `gh repo view ${nameWithOwner} --json name,owner,url,sshUrl`.quiet().nothrow();
16
+ if (view.exitCode !== 0)
17
+ return Option.none();
18
+ try {
19
+ const data = JSON.parse(view.stdout.toString());
20
+ return Option.some({ owner: data.owner.login, repo: data.name, url: data.url, sshUrl: data.sshUrl });
21
+ }
22
+ catch {
23
+ return Option.none();
24
+ }
25
+ }
26
+ export function ensureGitHubRepo(name, isPrivate = false) {
27
+ return Effect.tryPromise({
28
+ try: async () => {
29
+ const whoami = await $ `gh api user --jq .login`.quiet().nothrow();
30
+ const owner = whoami.exitCode === 0 ? whoami.stdout.toString().trim() : null;
31
+ if (owner) {
32
+ const existingOption = await viewRepo(`${owner}/${name}`);
33
+ if (Option.isSome(existingOption))
34
+ return { repo: existingOption.value, created: false };
35
+ }
36
+ const visibility = isPrivate ? '--private' : '--public';
37
+ const create = await $ `gh repo create ${name} ${visibility}`.quiet().nothrow();
38
+ if (create.exitCode !== 0) {
39
+ throw new Error(`gh repo create failed: ${create.stderr.toString().trim()}`);
40
+ }
41
+ const createdOption = await viewRepo(name);
42
+ if (Option.isNone(createdOption))
43
+ throw new Error(`repo created but could not retrieve details for "${name}"`);
44
+ return { repo: createdOption.value, created: true };
45
+ },
46
+ catch: (e) => e instanceof Error ? e.message : String(e),
47
+ });
48
+ }
49
+ export async function checkGitHubAccess(remoteUrl) {
50
+ const parsedOption = parseGithubOwnerRepo(remoteUrl);
51
+ if (Option.isNone(parsedOption))
52
+ return Option.none();
53
+ const { owner, repo } = parsedOption.value;
54
+ const result = await $ `gh api repos/${owner}/${repo}`.quiet().nothrow();
55
+ if (result.exitCode !== 0)
56
+ return Option.none();
57
+ let data;
58
+ try {
59
+ data = JSON.parse(result.stdout.toString());
60
+ }
61
+ catch {
62
+ return Option.none();
63
+ }
64
+ return Option.some({ owner, repo, canPush: data?.permissions?.push === true });
65
+ }
66
+ //# sourceMappingURL=git-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-remote.js","sourceRoot":"","sources":["../../../../../../../src/commands/npm/setup/git-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { $ } from 'bun';
2
+ import { existsSync } from 'node:fs';
3
+ import { Effect, Option } from 'effect';
4
+ import { makeCommand } from '@/common/command';
5
+ import { log } from '@/common/log';
6
+ import { acquireToken } from './npm-auth';
7
+ import { fetchPackageInfo } from './package-registry';
8
+ import { addTrustedPublisher, setPackageAccessPolicy } from './trusted-publishing';
9
+ import { checkGitHubAccess } from './git-remote';
10
+ import { workflowExists, createWorkflow } from './workflow';
11
+ import { validatePackageJson } from './package-json-validate';
12
+ var SetupError;
13
+ (function (SetupError) {
14
+ SetupError["NoGitRepo"] = "NoGitRepo";
15
+ SetupError["NoPackageJson"] = "NoPackageJson";
16
+ SetupError["InvalidPackageJson"] = "InvalidPackageJson";
17
+ SetupError["NpmNotFound"] = "NpmNotFound";
18
+ SetupError["GhNotFound"] = "GhNotFound";
19
+ SetupError["NotLoggedIn"] = "NotLoggedIn";
20
+ SetupError["NoGitRemote"] = "NoGitRemote";
21
+ SetupError["RepoNotFound"] = "RepoNotFound";
22
+ SetupError["NoWriteAccess"] = "NoWriteAccess";
23
+ SetupError["BuildFailed"] = "BuildFailed";
24
+ SetupError["PublishFailed"] = "PublishFailed";
25
+ SetupError["TrustedPublishingFailed"] = "TrustedPublishingFailed";
26
+ SetupError["AccessPolicyFailed"] = "AccessPolicyFailed";
27
+ })(SetupError || (SetupError = {}));
28
+ export const setup = makeCommand('setup', 'configure a new npm package for publishing', () => Effect.gen(function* () {
29
+ const cwd = process.cwd();
30
+ // 1. npm
31
+ log('checking npm...');
32
+ const npmCheck = yield* Effect.promise(() => $ `which npm`.quiet().nothrow());
33
+ if (npmCheck.exitCode !== 0)
34
+ yield* Effect.fail(`${SetupError.NpmNotFound}: "npm" not found in PATH — install Node.js from nodejs.org`);
35
+ const npmVersion = (yield* Effect.promise(() => $ `npm --version`.quiet().nothrow())).stdout.toString().trim();
36
+ const [major, minor] = npmVersion.split('.').map(Number);
37
+ if (major < 11 || (major === 11 && minor < 10))
38
+ yield* Effect.fail(`${SetupError.NpmNotFound}: npm ${npmVersion} is too old — "npm trust" requires 11.10.0+ (run "npm install -g npm")`);
39
+ const { token: npmToken, user: npmUser } = yield* acquireToken().pipe(Effect.mapError(e => `${SetupError.NotLoggedIn}: npm authentication failed: ${e}`));
40
+ log(` ✓ logged into npm as ${npmUser}`);
41
+ // 2. GitHub CLI
42
+ log('checking GitHub...');
43
+ const ghCheck = yield* Effect.promise(() => $ `which gh`.quiet().nothrow());
44
+ if (ghCheck.exitCode !== 0)
45
+ yield* Effect.fail(`${SetupError.GhNotFound}: "gh" not found in PATH — install GitHub CLI from cli.github.com`);
46
+ let ghUser = yield* Effect.promise(() => $ `gh api user --jq .login`.quiet().nothrow());
47
+ if (ghUser.exitCode !== 0) {
48
+ log(' not logged in — opening gh auth login...');
49
+ yield* Effect.promise(() => $ `gh auth login`.nothrow());
50
+ ghUser = yield* Effect.promise(() => $ `gh api user --jq .login`.quiet().nothrow());
51
+ }
52
+ if (ghUser.exitCode !== 0)
53
+ yield* Effect.fail(`${SetupError.NotLoggedIn}: not logged into GitHub — run "gh auth login"`);
54
+ log(` ✓ logged into github as ${ghUser.stdout.toString().trim()}`);
55
+ // 3. git repo root
56
+ if (!existsSync(`${cwd}/.git`))
57
+ yield* Effect.fail(`${SetupError.NoGitRepo}: current directory is not a git repository — run "git init" first`);
58
+ // 4. package.json — read and fatal-check
59
+ log('checking package.json...');
60
+ const pkgFile = Bun.file(`${cwd}/package.json`);
61
+ if (!(yield* Effect.promise(() => pkgFile.exists())))
62
+ yield* Effect.fail(`${SetupError.NoPackageJson}: no package.json found — run this command from a package directory`);
63
+ let pkg = yield* Effect.tryPromise({
64
+ try: () => pkgFile.json(),
65
+ catch: () => `${SetupError.InvalidPackageJson}: package.json contains invalid JSON — fix it and retry`,
66
+ });
67
+ const { name } = pkg;
68
+ if (!name)
69
+ yield* Effect.fail(`${SetupError.InvalidPackageJson}: package.json is missing a "name" field`);
70
+ log(` name: ${name}`);
71
+ const fatal = validatePackageJson(pkg).find(i => i.fatal);
72
+ if (fatal)
73
+ yield* Effect.fail(`${SetupError.InvalidPackageJson}: ${fatal.field}: ${fatal.issue}`);
74
+ // 5. git remote
75
+ log('checking git remote...');
76
+ const remoteOption = yield* Effect.promise(() => getRemoteUrl(cwd));
77
+ if (Option.isNone(remoteOption))
78
+ yield* Effect.fail(`${SetupError.NoGitRemote}: no git remote configured — run "git remote add origin <url>" first`);
79
+ const remote = remoteOption.value;
80
+ log(` remote: ${remote}`);
81
+ const accessOption = yield* Effect.promise(() => checkGitHubAccess(remote));
82
+ if (Option.isNone(accessOption))
83
+ yield* Effect.fail(`${SetupError.RepoNotFound}: could not reach GitHub repo at ${remote} — check "gh auth status"`);
84
+ const access = accessOption.value;
85
+ if (!access.canPush)
86
+ yield* Effect.fail(`${SetupError.NoWriteAccess}: no push access to ${access.owner}/${access.repo} — you need write permissions`);
87
+ const repoHttpsUrl = `https://github.com/${access.owner}/${access.repo}`;
88
+ log(` ✓ ${access.owner}/${access.repo} (write access confirmed)`);
89
+ // 6. Sync package.json repository URL from git remote; report other non-fatal issues
90
+ const expectedRepoUrl = `git+${repoHttpsUrl}.git`;
91
+ const currentRepoUrl = typeof pkg.repository === 'object' ? pkg.repository?.url : pkg.repository;
92
+ if (currentRepoUrl !== expectedRepoUrl) {
93
+ log('syncing package.json repository URL...');
94
+ log(` was: ${currentRepoUrl ?? '(missing)'}`);
95
+ pkg = { ...pkg, repository: { type: 'git', url: expectedRepoUrl } };
96
+ yield* Effect.promise(() => Bun.write(`${cwd}/package.json`, JSON.stringify(pkg, null, 2) + '\n'));
97
+ log(` ✓ set to ${expectedRepoUrl}`);
98
+ }
99
+ const nonFatal = validatePackageJson(pkg).filter(i => !i.fatal);
100
+ if (nonFatal.length > 0) {
101
+ log('package.json issues (fix manually):');
102
+ for (const { field, issue } of nonFatal)
103
+ log(` ${field}: ${issue}`);
104
+ }
105
+ // 7. Publish workflow
106
+ log('checking publish workflow...');
107
+ if (!(yield* Effect.promise(() => workflowExists(cwd)))) {
108
+ yield* Effect.promise(() => createWorkflow(cwd));
109
+ log(' ✓ created .github/workflows/publish.yml');
110
+ }
111
+ else {
112
+ log(' ✓ already exists');
113
+ }
114
+ // 8. npm package — initial publish if not yet on registry
115
+ log('checking npm registry...');
116
+ const infoOption = yield* fetchPackageInfo(name).pipe(Effect.mapError(e => `${SetupError.NpmNotFound}: npm registry lookup failed: ${e}`));
117
+ if (Option.isNone(infoOption)) {
118
+ log(' package not yet published — building and creating initial release...');
119
+ const buildResult = yield* Effect.promise(() => $ `bun run build`.nothrow());
120
+ if (buildResult.exitCode !== 0)
121
+ yield* Effect.fail(`${SetupError.BuildFailed}: build failed: ${buildResult.stderr.toString().trim()}`);
122
+ const distPkgFile = Bun.file(`${cwd}/dist/package.json`);
123
+ if (!(yield* Effect.promise(() => distPkgFile.exists())))
124
+ yield* Effect.fail(`${SetupError.BuildFailed}: build succeeded but dist/package.json is missing — build script must produce it`);
125
+ yield* Effect.tryPromise({
126
+ try: () => distPkgFile.json(),
127
+ catch: () => `${SetupError.BuildFailed}: dist/package.json exists but contains invalid JSON — check your build script`,
128
+ });
129
+ yield* npmPublish(npmToken).pipe(Effect.mapError(e => `${SetupError.PublishFailed}: ${e}`));
130
+ log(` ✓ published ${name}`);
131
+ }
132
+ else {
133
+ const version = infoOption.value.latestVersion ?? '(unknown)';
134
+ log(` ✓ exists (latest v${version})`);
135
+ }
136
+ // 9. Trusted publishing
137
+ log('checking trusted publishing...');
138
+ const ownerRepo = `${access.owner}/${access.repo}`;
139
+ const trust = yield* addTrustedPublisher(name, ownerRepo, npmToken).pipe(Effect.mapError(e => `${SetupError.TrustedPublishingFailed}: ${e}`));
140
+ log(trust.alreadyConfigured ? ' ✓ already configured' : ' ✓ configured');
141
+ // 10. Package access policy — require 2FA, disallow automation tokens
142
+ log('setting package access policy...');
143
+ yield* setPackageAccessPolicy(name, npmToken, trust.otp).pipe(Effect.mapError(e => `${SetupError.AccessPolicyFailed}: ${e}`));
144
+ log(' ✓ configured');
145
+ }));
146
+ async function getRemoteUrl(cwd) {
147
+ const result = await $ `git -C ${cwd} remote get-url origin`.quiet().nothrow();
148
+ if (result.exitCode !== 0)
149
+ return Option.none();
150
+ return Option.some(result.stdout.toString().trim());
151
+ }
152
+ function npmPublish(token) {
153
+ return Effect.tryPromise({
154
+ try: async () => {
155
+ const proc = Bun.spawn(['npm', 'publish', 'dist/', '--access', 'public', '--no-provenance'], {
156
+ stdin: 'inherit',
157
+ stdout: 'inherit',
158
+ stderr: 'inherit',
159
+ env: { ...process.env, NODE_AUTH_TOKEN: token },
160
+ });
161
+ const exitCode = await proc.exited;
162
+ if (exitCode !== 0)
163
+ throw new Error('npm publish failed — see output above');
164
+ },
165
+ catch: (e) => e instanceof Error ? e.message : String(e),
166
+ });
167
+ }
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/commands/npm/setup/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { $ } from 'bun';
2
+ import { readFileSync, writeFileSync, unlinkSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { Effect, Option } from 'effect';
5
+ import { log } from '@/common/log';
6
+ const npmrcPath = `${homedir()}/.npmrc`;
7
+ const TOKEN_RE = /^\/\/registry\.npmjs\.org\/:_authToken=(\S+)$/m;
8
+ function readNpmrc() {
9
+ try {
10
+ return readFileSync(npmrcPath, 'utf8');
11
+ }
12
+ catch {
13
+ return '';
14
+ }
15
+ }
16
+ function stripTokenFromDisk() {
17
+ const content = readNpmrc();
18
+ const stripped = content.replace(TOKEN_RE, '').replace(/\n{3,}/g, '\n\n').trim();
19
+ if (!stripped) {
20
+ try {
21
+ unlinkSync(npmrcPath);
22
+ }
23
+ catch { }
24
+ }
25
+ else {
26
+ writeFileSync(npmrcPath, stripped + '\n');
27
+ }
28
+ }
29
+ async function whoamiWithToken(token) {
30
+ const result = await $ `npm whoami`
31
+ .env({ ...process.env, NODE_AUTH_TOKEN: token })
32
+ .quiet().nothrow();
33
+ if (result.exitCode !== 0)
34
+ return Option.none();
35
+ return Option.some(result.stdout.toString().trim());
36
+ }
37
+ export function acquireToken() {
38
+ return Effect.tryPromise({
39
+ try: async () => {
40
+ const existing = readNpmrc().match(TOKEN_RE)?.[1];
41
+ if (existing) {
42
+ const userOption = await whoamiWithToken(existing);
43
+ if (Option.isSome(userOption)) {
44
+ stripTokenFromDisk();
45
+ return { token: existing, user: userOption.value };
46
+ }
47
+ }
48
+ log(' not logged in — opening npm login...');
49
+ await $ `npm login`.nothrow();
50
+ const token = readNpmrc().match(TOKEN_RE)?.[1];
51
+ if (!token)
52
+ throw new Error('npm login did not produce a token — try running "npm login" manually');
53
+ const userOption = await whoamiWithToken(token);
54
+ if (Option.isNone(userOption))
55
+ throw new Error('npm login succeeded but token verification failed');
56
+ stripTokenFromDisk();
57
+ return { token, user: userOption.value };
58
+ },
59
+ catch: (e) => e instanceof Error ? e.message : String(e),
60
+ });
61
+ }
62
+ //# sourceMappingURL=npm-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-auth.js","sourceRoot":"","sources":["../../../../../../../src/commands/npm/setup/npm-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ const GITHUB_URL_RE = /^git\+https:\/\/github\.com\/[^/]+\/[^/]+\.git$/;
2
+ function isValidGitHubUrl(url) {
3
+ return GITHUB_URL_RE.test(url);
4
+ }
5
+ function normalizeRepoUrl(url) {
6
+ if (!url.startsWith('git+'))
7
+ url = `git+${url}`;
8
+ if (!url.endsWith('.git'))
9
+ url = `${url}.git`;
10
+ return url;
11
+ }
12
+ export function validatePackageJson(pkg) {
13
+ const issues = [];
14
+ const repoUrl = typeof pkg.repository === 'object' ? pkg.repository?.url : pkg.repository;
15
+ if (!repoUrl) {
16
+ issues.push({ field: 'repository', issue: 'missing — required for provenance' });
17
+ }
18
+ else if (!isValidGitHubUrl(repoUrl)) {
19
+ issues.push({ field: 'repository.url', issue: `not a valid GitHub URL (got "${repoUrl}")` });
20
+ }
21
+ if (pkg.publishConfig?.access !== 'public') {
22
+ issues.push({ field: 'publishConfig.access', issue: 'should be "public"' });
23
+ }
24
+ if (pkg.publishConfig?.provenance !== true) {
25
+ issues.push({ field: 'publishConfig.provenance', issue: 'should be true' });
26
+ }
27
+ if (!pkg.version) {
28
+ issues.push({ field: 'version', issue: 'missing — add a "version" field (e.g. "0.0.1")', fatal: true });
29
+ }
30
+ if (!pkg.scripts?.['build']) {
31
+ issues.push({ field: 'scripts.build', issue: 'missing — add a "build" script before running setup', fatal: true });
32
+ }
33
+ if (!pkg.files?.includes('dist')) {
34
+ issues.push({ field: 'files', issue: '"dist" not included — built output won\'t be published' });
35
+ }
36
+ return issues;
37
+ }
38
+ export function buildFixedPackageJson(pkg, repoUrl) {
39
+ const url = normalizeRepoUrl(repoUrl);
40
+ return {
41
+ ...pkg,
42
+ repository: { type: 'git', url },
43
+ publishConfig: { access: 'public', provenance: true },
44
+ files: pkg.files?.includes('dist') ? pkg.files : [...(pkg.files ?? []), 'dist'],
45
+ };
46
+ }
47
+ //# sourceMappingURL=package-json-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json-validate.js","sourceRoot":"","sources":["../../../../../../../src/commands/npm/setup/package-json-validate.ts"],"names":[],"mappings":"AAeA,MAAM,aAAa,GAAG,iDAAiD,CAAC;AAExE,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;IAC1F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;IACnF,CAAC;SAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gCAAgC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,gDAAgD,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,qDAAqD,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,wDAAwD,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAQ,EAAE,OAAe;IAC7D,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO;QACL,GAAG,GAAG;QACN,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;QAChC,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;QACrD,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC;KAChF,CAAC;AACJ,CAAC"}