1+ #!/usr/bin/env bun
2+ /**
3+ * Simple CLI tool for managing VERCEL_OIDC_TOKEN using bun.secrets
4+ *
5+ * Usage:
6+ * bun run secrets set VERCEL_OIDC_TOKEN <value> # Set the token
7+ * bun run secrets get VERCEL_OIDC_TOKEN # Get the token
8+ * bun run secrets # Show status
9+ */
10+
11+ import { secrets } from "bun" ;
12+
13+ async function showStatus ( ) {
14+ console . log ( "\n🔐 Vercel OIDC Token Status" ) ;
15+ console . log ( "─" . repeat ( 40 ) ) ;
16+
17+ const token = await secrets . get ( {
18+ service : "svelte-ai" ,
19+ name : "VERCEL_OIDC_TOKEN"
20+ } ) ;
21+
22+ if ( token ) {
23+ const masked = token . slice ( 0 , 12 ) + "..." + token . slice ( - 8 ) ;
24+ console . log ( `✅ VERCEL_OIDC_TOKEN: ${ masked } ` ) ;
25+ } else {
26+ console . log ( "❌ VERCEL_OIDC_TOKEN: Not set" ) ;
27+ console . log ( "\n💡 Run 'bun run secrets set VERCEL_OIDC_TOKEN <value>' to set it" ) ;
28+ }
29+ }
30+
31+ async function setToken ( value : string ) {
32+ if ( ! value ) {
33+ // Empty value means delete the token
34+ await secrets . delete ( {
35+ service : "svelte-ai" ,
36+ name : "VERCEL_OIDC_TOKEN"
37+ } ) ;
38+ console . log ( "🗑️ VERCEL_OIDC_TOKEN deleted from OS credential manager" ) ;
39+ return ;
40+ }
41+
42+ if ( value . length < 20 ) {
43+ console . error ( "❌ Invalid token: VERCEL_OIDC_TOKEN appears to be too short" ) ;
44+ process . exit ( 1 ) ;
45+ }
46+
47+ await secrets . set ( {
48+ service : "svelte-ai" ,
49+ name : "VERCEL_OIDC_TOKEN" ,
50+ value,
51+ } ) ;
52+
53+ console . log ( "✅ VERCEL_OIDC_TOKEN stored securely in OS credential manager" ) ;
54+ }
55+
56+ async function getToken ( ) {
57+ const token = await secrets . get ( {
58+ service : "svelte-ai" ,
59+ name : "VERCEL_OIDC_TOKEN"
60+ } ) ;
61+
62+ if ( token ) {
63+ console . log ( `VERCEL_OIDC_TOKEN: ${ token } ` ) ;
64+ } else {
65+ console . log ( "❌ VERCEL_OIDC_TOKEN not found" ) ;
66+ process . exit ( 1 ) ;
67+ }
68+ }
69+
70+ async function loadTokenToEnv ( ) {
71+ const token = await secrets . get ( {
72+ service : "svelte-ai" ,
73+ name : "VERCEL_OIDC_TOKEN"
74+ } ) ;
75+
76+ if ( token ) {
77+ process . env . VERCEL_OIDC_TOKEN = token ;
78+ console . log ( "✅ VERCEL_OIDC_TOKEN loaded from bun.secrets" ) ;
79+ }
80+ }
81+
82+ // Export for use in main application
83+ export { loadTokenToEnv } ;
84+
85+ // CLI logic
86+ if ( import . meta. main ) {
87+ const command = process . argv [ 2 ] ;
88+ const arg1 = process . argv [ 3 ] ;
89+ const arg2 = process . argv [ 4 ] ;
90+
91+ switch ( command ) {
92+ case "set" :
93+ if ( arg1 !== "VERCEL_OIDC_TOKEN" ) {
94+ console . error ( "Usage: bun run secrets set VERCEL_OIDC_TOKEN <value>" ) ;
95+ process . exit ( 1 ) ;
96+ }
97+ // Empty arg2 means delete, otherwise set the value
98+ await setToken ( arg2 || "" ) ;
99+ break ;
100+
101+ case "get" :
102+ if ( arg1 !== "VERCEL_OIDC_TOKEN" ) {
103+ console . error ( "Usage: bun run secrets get VERCEL_OIDC_TOKEN" ) ;
104+ process . exit ( 1 ) ;
105+ }
106+ await getToken ( ) ;
107+ break ;
108+
109+ case "load" :
110+ // Internal command used by main app
111+ await loadTokenToEnv ( ) ;
112+ break ;
113+
114+ case undefined :
115+ case "status" :
116+ await showStatus ( ) ;
117+ break ;
118+
119+ default :
120+ console . error ( `Unknown command: ${ command } ` ) ;
121+ console . error ( "Available commands: status, set VERCEL_OIDC_TOKEN <value>, get VERCEL_OIDC_TOKEN" ) ;
122+ process . exit ( 1 ) ;
123+ }
124+ }
0 commit comments