@yhonda/gcloud-secrets 2.0.6 → 2.0.8

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/cli.js CHANGED
@@ -408,6 +408,59 @@ async function runCli(args) {
408
408
  break;
409
409
  }
410
410
 
411
+ case "search": {
412
+ const keyword = parsed.positional[1];
413
+ if (!keyword) {
414
+ console.log("使い方: gcloud-secrets search <keyword> [--env <env>]");
415
+ process.exit(1);
416
+ }
417
+
418
+ const filterEnv = parsed.env;
419
+ const parent = `projects/${config.centralProject}`;
420
+ const [secrets] = await client.listSecrets({ parent });
421
+
422
+ console.log(`Searching for: "${keyword}"`);
423
+ if (filterEnv) console.log(` 環境: ${filterEnv}`);
424
+ console.log(`\nScanning ${secrets.length} secrets...\n`);
425
+
426
+ const matches = [];
427
+ const folders = new Set();
428
+
429
+ for (const secret of secrets) {
430
+ const [secretData] = await client.getSecret({ name: secret.name });
431
+ const folder = secretData.labels?.folder;
432
+ const env = secretData.labels?.environment || "(default)";
433
+
434
+ // 環境フィルタ
435
+ if (filterEnv && secretData.labels?.environment !== filterEnv) continue;
436
+
437
+ // 値を取得してキーワード検索
438
+ try {
439
+ const [version] = await client.accessSecretVersion({
440
+ name: `${secret.name}/versions/latest`,
441
+ });
442
+ const value = version.payload.data.toString("utf-8");
443
+ if (value.includes(keyword)) {
444
+ const { key } = getKeyFromSecret(secret.name.split("/").pop(), folder);
445
+ matches.push({ folder, env, key });
446
+ folders.add(folder);
447
+ }
448
+ } catch {
449
+ // バージョンがない場合はスキップ
450
+ }
451
+ }
452
+
453
+ if (matches.length === 0) {
454
+ console.log("No matches found");
455
+ } else {
456
+ for (const m of matches) {
457
+ console.log(`[FOUND] ${m.folder} / ${m.env} - ${m.key}`);
458
+ }
459
+ console.log(`\nFound ${matches.length} matches in ${folders.size} folders`);
460
+ }
461
+ break;
462
+ }
463
+
411
464
  default:
412
465
  console.log(`gcloud-secrets - GCP Secret Manager CLI
413
466
 
@@ -417,6 +470,7 @@ async function runCli(args) {
417
470
  gcloud-secrets pull [folder] [--env <env>] シークレットを取得
418
471
  gcloud-secrets push [folder] [file] [--env <env>] シークレットをアップロード
419
472
  gcloud-secrets scan [basePath] [--env <env>] Git リポジトリの .env 同期状況をスキャン
473
+ gcloud-secrets search <keyword> [--env <env>] 値から逆引き検索
420
474
 
421
475
  オプション:
422
476
  --env, -e <env> 環境を指定 (dev, staging, prod など)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yhonda/gcloud-secrets",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "description": "GCP Secret Manager を GitHub clone 風に管理する CLI ツール",
5
5
  "type": "module",
6
6
  "main": "cli.js",
package/skills/secrets.md CHANGED
@@ -54,8 +54,31 @@ gcloud-secrets scan <path> --env prod
54
54
  ```
55
55
  Git リポジトリ内の .env / .dev.vars ファイルと Secret Manager の同期状況を確認します。
56
56
 
57
+ ### 値から逆引き検索 (search)
58
+ ```bash
59
+ # 特定の値がどのフォルダ・環境で使われているか検索
60
+ gcloud-secrets search "api-key-12345"
61
+
62
+ # 特定環境のみ検索
63
+ gcloud-secrets search "client-id" --env prod
64
+ ```
65
+ シークレットの値から、使用しているフォルダ・環境・キーを逆引き検索します。
66
+
57
67
  出力例:
58
68
  ```
69
+ Searching for: "api-key-12345"
70
+
71
+ Scanning 45 secrets...
72
+
73
+ [FOUND] my-app / dev - EXTERNAL_API_KEY
74
+ [FOUND] my-app / prod - EXTERNAL_API_KEY
75
+ [FOUND] other-service / dev - LINE_CLIENT_ID
76
+
77
+ Found 3 matches in 2 folders
78
+ ```
79
+
80
+ #### scan 出力例:
81
+ ```
59
82
  === Secret Manager 同期状況 ===
60
83
 
61
84
  [OK] project-a/ .env [dev] (3 keys)
@@ -96,4 +119,7 @@ gcloud-secrets scan ~/
96
119
 
97
120
  # 5. dev 環境のみスキャン
98
121
  gcloud-secrets scan ~/ --env dev
122
+
123
+ # 6. 特定の値がどこで使われているか検索
124
+ gcloud-secrets search "line-client-id-xxx"
99
125
  ```