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.
- package/bin/ck-darwin-arm64 +0 -0
- package/bin/ck-darwin-x64 +0 -0
- package/bin/ck-linux-x64 +0 -0
- package/bin/ck-win32-x64.exe +0 -0
- package/package.json +8 -2
- package/scripts/postinstall.js +74 -0
- package/.github/workflows/ci.yml +0 -45
- package/.github/workflows/claude-code-review.yml +0 -57
- package/.github/workflows/claude.yml +0 -50
- package/.github/workflows/release.yml +0 -102
- package/.releaserc.json +0 -17
- package/.repomixignore +0 -15
- package/AGENTS.md +0 -217
- package/CHANGELOG.md +0 -95
- package/CLAUDE.md +0 -34
- package/biome.json +0 -28
- package/bun.lock +0 -863
- package/dist/index.js +0 -22511
- package/src/commands/new.ts +0 -185
- package/src/commands/update.ts +0 -174
- package/src/commands/version.ts +0 -135
- package/src/index.ts +0 -102
- package/src/lib/auth.ts +0 -157
- package/src/lib/download.ts +0 -689
- package/src/lib/github.ts +0 -230
- package/src/lib/merge.ts +0 -119
- package/src/lib/prompts.ts +0 -114
- package/src/types.ts +0 -178
- package/src/utils/config.ts +0 -87
- package/src/utils/file-scanner.ts +0 -134
- package/src/utils/logger.ts +0 -124
- package/src/utils/safe-prompts.ts +0 -44
- package/src/utils/safe-spinner.ts +0 -38
- package/src/version.json +0 -3
- package/tests/commands/version.test.ts +0 -297
- package/tests/integration/cli.test.ts +0 -252
- package/tests/lib/auth.test.ts +0 -116
- package/tests/lib/download.test.ts +0 -292
- package/tests/lib/github-download-priority.test.ts +0 -432
- package/tests/lib/github.test.ts +0 -52
- package/tests/lib/merge.test.ts +0 -267
- package/tests/lib/prompts.test.ts +0 -66
- package/tests/types.test.ts +0 -337
- package/tests/utils/config.test.ts +0 -263
- package/tests/utils/file-scanner.test.ts +0 -202
- package/tests/utils/logger.test.ts +0 -239
- 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
|
-
}
|