claudekit-cli 1.4.1 → 1.5.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 (47) hide show
  1. package/bin/ck-darwin-arm64 +0 -0
  2. package/bin/ck-darwin-x64 +0 -0
  3. package/bin/ck-linux-x64 +0 -0
  4. package/bin/ck-win32-x64.exe +0 -0
  5. package/package.json +8 -2
  6. package/scripts/postinstall.js +74 -0
  7. package/.github/workflows/ci.yml +0 -45
  8. package/.github/workflows/claude-code-review.yml +0 -57
  9. package/.github/workflows/claude.yml +0 -50
  10. package/.github/workflows/release.yml +0 -102
  11. package/.releaserc.json +0 -17
  12. package/.repomixignore +0 -15
  13. package/AGENTS.md +0 -217
  14. package/CHANGELOG.md +0 -95
  15. package/CLAUDE.md +0 -34
  16. package/biome.json +0 -28
  17. package/bun.lock +0 -863
  18. package/dist/index.js +0 -22511
  19. package/src/commands/new.ts +0 -185
  20. package/src/commands/update.ts +0 -174
  21. package/src/commands/version.ts +0 -135
  22. package/src/index.ts +0 -102
  23. package/src/lib/auth.ts +0 -157
  24. package/src/lib/download.ts +0 -689
  25. package/src/lib/github.ts +0 -230
  26. package/src/lib/merge.ts +0 -119
  27. package/src/lib/prompts.ts +0 -114
  28. package/src/types.ts +0 -178
  29. package/src/utils/config.ts +0 -87
  30. package/src/utils/file-scanner.ts +0 -134
  31. package/src/utils/logger.ts +0 -124
  32. package/src/utils/safe-prompts.ts +0 -44
  33. package/src/utils/safe-spinner.ts +0 -38
  34. package/src/version.json +0 -3
  35. package/tests/commands/version.test.ts +0 -297
  36. package/tests/integration/cli.test.ts +0 -252
  37. package/tests/lib/auth.test.ts +0 -116
  38. package/tests/lib/download.test.ts +0 -292
  39. package/tests/lib/github-download-priority.test.ts +0 -432
  40. package/tests/lib/github.test.ts +0 -52
  41. package/tests/lib/merge.test.ts +0 -267
  42. package/tests/lib/prompts.test.ts +0 -66
  43. package/tests/types.test.ts +0 -337
  44. package/tests/utils/config.test.ts +0 -263
  45. package/tests/utils/file-scanner.test.ts +0 -202
  46. package/tests/utils/logger.test.ts +0 -239
  47. package/tsconfig.json +0 -30
package/src/lib/auth.ts DELETED
@@ -1,157 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import * as clack from "@clack/prompts";
3
- import keytar from "keytar";
4
- import { type AuthMethod, AuthenticationError } from "../types.js";
5
- import { ConfigManager } from "../utils/config.js";
6
- import { logger } from "../utils/logger.js";
7
-
8
- const SERVICE_NAME = "claudekit-cli";
9
- const ACCOUNT_NAME = "github-token";
10
-
11
- export class AuthManager {
12
- private static token: string | null = null;
13
- private static authMethod: AuthMethod | null = null;
14
-
15
- /**
16
- * Get GitHub token with multi-tier fallback
17
- */
18
- static async getToken(): Promise<{ token: string; method: AuthMethod }> {
19
- if (AuthManager.token && AuthManager.authMethod) {
20
- return { token: AuthManager.token, method: AuthManager.authMethod };
21
- }
22
-
23
- // Try 1: GitHub CLI
24
- try {
25
- const token = await AuthManager.getFromGhCli();
26
- if (token) {
27
- AuthManager.token = token;
28
- AuthManager.authMethod = "gh-cli";
29
- logger.debug("Using GitHub CLI authentication");
30
- return { token, method: "gh-cli" };
31
- }
32
- } catch (error) {
33
- logger.debug("GitHub CLI not available");
34
- }
35
-
36
- // Try 2: Environment variables
37
- const envToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
38
- if (envToken) {
39
- AuthManager.token = envToken;
40
- AuthManager.authMethod = "env-var";
41
- logger.debug("Using environment variable authentication");
42
- return { token: envToken, method: "env-var" };
43
- }
44
-
45
- // Try 3: Config file
46
- try {
47
- const configToken = await ConfigManager.getToken();
48
- if (configToken) {
49
- AuthManager.token = configToken;
50
- AuthManager.authMethod = "env-var";
51
- logger.debug("Using config file authentication");
52
- return { token: configToken, method: "env-var" };
53
- }
54
- } catch (error) {
55
- logger.debug("No token in config file");
56
- }
57
-
58
- // Try 4: OS Keychain
59
- try {
60
- const keychainToken = await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
61
- if (keychainToken) {
62
- AuthManager.token = keychainToken;
63
- AuthManager.authMethod = "keychain";
64
- logger.debug("Using keychain authentication");
65
- return { token: keychainToken, method: "keychain" };
66
- }
67
- } catch (error) {
68
- logger.debug("No token in keychain");
69
- }
70
-
71
- // Try 5: Prompt user
72
- const promptedToken = await AuthManager.promptForToken();
73
- AuthManager.token = promptedToken;
74
- AuthManager.authMethod = "prompt";
75
- return { token: promptedToken, method: "prompt" };
76
- }
77
-
78
- /**
79
- * Get token from GitHub CLI
80
- */
81
- private static async getFromGhCli(): Promise<string | null> {
82
- try {
83
- const token = execSync("gh auth token", {
84
- encoding: "utf-8",
85
- stdio: ["pipe", "pipe", "ignore"],
86
- }).trim();
87
- if (token && token.length > 0) {
88
- return token;
89
- }
90
- return null;
91
- } catch {
92
- return null;
93
- }
94
- }
95
-
96
- /**
97
- * Prompt user for token
98
- */
99
- private static async promptForToken(): Promise<string> {
100
- const token = await clack.password({
101
- message: "Enter your GitHub Personal Access Token:",
102
- validate: (value) => {
103
- if (!value || value.length === 0) {
104
- return "Token is required";
105
- }
106
- if (!value.startsWith("ghp_") && !value.startsWith("github_pat_")) {
107
- return 'Invalid token format. Token should start with "ghp_" or "github_pat_"';
108
- }
109
- return;
110
- },
111
- });
112
-
113
- if (clack.isCancel(token)) {
114
- throw new AuthenticationError("Authentication cancelled by user");
115
- }
116
-
117
- // Ask if user wants to save token
118
- const save = await clack.confirm({
119
- message: "Save token securely in OS keychain?",
120
- });
121
-
122
- if (save && !clack.isCancel(save)) {
123
- try {
124
- await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, token);
125
- logger.success("Token saved securely in keychain");
126
- } catch (error) {
127
- logger.warning("Failed to save token to keychain");
128
- }
129
- }
130
-
131
- return token;
132
- }
133
-
134
- /**
135
- * Clear stored token
136
- */
137
- static async clearToken(): Promise<void> {
138
- // Always clear in-memory token
139
- AuthManager.token = null;
140
- AuthManager.authMethod = null;
141
-
142
- // Try to clear from keychain (may fail in CI)
143
- try {
144
- await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);
145
- logger.success("Token cleared from keychain");
146
- } catch (error) {
147
- logger.warning("Failed to clear token from keychain");
148
- }
149
- }
150
-
151
- /**
152
- * Validate token format
153
- */
154
- static isValidTokenFormat(token: string): boolean {
155
- return token.startsWith("ghp_") || token.startsWith("github_pat_");
156
- }
157
- }