promptkaizen-agent 0.6.3 → 0.7.2

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 (77) hide show
  1. package/README.md +24 -0
  2. package/dist/analyze/index.d.ts.map +1 -1
  3. package/dist/analyze/index.js +1 -1
  4. package/dist/analyze/index.js.map +1 -1
  5. package/dist/analyze/optimize-rules-fetcher.d.ts +1 -2
  6. package/dist/analyze/optimize-rules-fetcher.d.ts.map +1 -1
  7. package/dist/analyze/optimize-rules-fetcher.js +5 -2
  8. package/dist/analyze/optimize-rules-fetcher.js.map +1 -1
  9. package/dist/batcher.d.ts +18 -1
  10. package/dist/batcher.d.ts.map +1 -1
  11. package/dist/batcher.js +77 -36
  12. package/dist/batcher.js.map +1 -1
  13. package/dist/cli/disable-hooks.d.ts +2 -0
  14. package/dist/cli/disable-hooks.d.ts.map +1 -0
  15. package/dist/cli/disable-hooks.js +117 -0
  16. package/dist/cli/disable-hooks.js.map +1 -0
  17. package/dist/cli/hook.d.ts.map +1 -1
  18. package/dist/cli/hook.js +15 -5
  19. package/dist/cli/hook.js.map +1 -1
  20. package/dist/cli/init.d.ts.map +1 -1
  21. package/dist/cli/init.js +4 -2
  22. package/dist/cli/init.js.map +1 -1
  23. package/dist/cli/mcp.js +1 -1
  24. package/dist/cli/mcp.js.map +1 -1
  25. package/dist/cli/start.d.ts.map +1 -1
  26. package/dist/cli/start.js +11 -3
  27. package/dist/cli/start.js.map +1 -1
  28. package/dist/cli/status.d.ts.map +1 -1
  29. package/dist/cli/status.js +15 -1
  30. package/dist/cli/status.js.map +1 -1
  31. package/dist/config.d.ts +71 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +76 -3
  34. package/dist/config.js.map +1 -1
  35. package/dist/detection/engine.d.ts +149 -0
  36. package/dist/detection/engine.d.ts.map +1 -0
  37. package/dist/detection/engine.js +0 -0
  38. package/dist/detection/engine.js.map +1 -0
  39. package/dist/detection/index.d.ts +3 -0
  40. package/dist/detection/index.d.ts.map +1 -0
  41. package/dist/detection/index.js +24 -0
  42. package/dist/detection/index.js.map +1 -0
  43. package/dist/detection/rules.d.ts +103 -0
  44. package/dist/detection/rules.d.ts.map +1 -0
  45. package/dist/detection/rules.js +586 -0
  46. package/dist/detection/rules.js.map +1 -0
  47. package/dist/hooks/claude-hook.d.ts +31 -4
  48. package/dist/hooks/claude-hook.d.ts.map +1 -1
  49. package/dist/hooks/claude-hook.js +131 -16
  50. package/dist/hooks/claude-hook.js.map +1 -1
  51. package/dist/hooks/hook-pause.d.ts +34 -0
  52. package/dist/hooks/hook-pause.d.ts.map +1 -0
  53. package/dist/hooks/hook-pause.js +111 -0
  54. package/dist/hooks/hook-pause.js.map +1 -0
  55. package/dist/hooks/pretooluse-policy.d.ts +34 -0
  56. package/dist/hooks/pretooluse-policy.d.ts.map +1 -0
  57. package/dist/hooks/pretooluse-policy.js +97 -0
  58. package/dist/hooks/pretooluse-policy.js.map +1 -0
  59. package/dist/index.js +8 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/mask-rules-fetcher.d.ts +5 -0
  62. package/dist/mask-rules-fetcher.d.ts.map +1 -1
  63. package/dist/mask-rules-fetcher.js +9 -2
  64. package/dist/mask-rules-fetcher.js.map +1 -1
  65. package/dist/pii-masker.d.ts.map +1 -1
  66. package/dist/pii-masker.js.map +1 -1
  67. package/dist/secret-detector.d.ts +51 -27
  68. package/dist/secret-detector.d.ts.map +1 -1
  69. package/dist/secret-detector.js +108 -439
  70. package/dist/secret-detector.js.map +1 -1
  71. package/dist/version.d.ts +1 -1
  72. package/dist/version.js +1 -1
  73. package/package.json +1 -1
  74. package/dist/suppress-sea-warning.d.ts +0 -2
  75. package/dist/suppress-sea-warning.d.ts.map +0 -1
  76. package/dist/suppress-sea-warning.js +0 -21
  77. package/dist/suppress-sea-warning.js.map +0 -1
@@ -0,0 +1,586 @@
1
+ "use strict";
2
+ // ==========================================================================
3
+ // 自動生成ファイル — 直接編集しないこと
4
+ // 正: shared/src/detection/rules.ts
5
+ // 再生成: npm run sync:detection
6
+ // ==========================================================================
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.VALIDATORS = exports.HIGH_ENTROPY_RULE = exports.DETECTION_RULES = exports.PEM_BLOCK_SOURCE = exports.ENTROPY_THRESHOLD = exports.ENTROPY_MIN_LENGTH = void 0;
9
+ exports.normalizeWithMap = normalizeWithMap;
10
+ exports.normalizeForDetection = normalizeForDetection;
11
+ exports.luhnValid = luhnValid;
12
+ exports.isValidMyNumber = isValidMyNumber;
13
+ exports.isValidCorporateNumber = isValidCorporateNumber;
14
+ exports.isLikelyCredential = isLikelyCredential;
15
+ exports.isLikelyBankAccount = isLikelyBankAccount;
16
+ exports.isLikelyAccountHolder = isLikelyAccountHolder;
17
+ exports.isLikelyPersonName = isLikelyPersonName;
18
+ exports.shannonEntropy = shannonEntropy;
19
+ exports.redactionLabel = redactionLabel;
20
+ // ---------------------------------------------
21
+ // 正規化前処理 (全角→半角 / 単一桁の漢数字→算用数字)
22
+ // ---------------------------------------------
23
+ const KANJI_DIGITS = {
24
+ 〇: '0', 零: '0', 一: '1', 二: '2', 三: '3', 四: '4',
25
+ 五: '5', 六: '6', 七: '7', 八: '8', 九: '9',
26
+ };
27
+ /**
28
+ * 直前の文字と一体で正規化すべき結合文字。
29
+ * 半角カタカナの濁点・半濁点 (ハ + ゙ → バ) は汎用カテゴリが Lm なので個別に列挙し、
30
+ * 結合用の濁点 (U+3099/U+309A) やラテン文字のアクセントは \p{Mn}/\p{Mc} で拾う。
31
+ */
32
+ const COMBINING = /[\uFF9E\uFF9F]|\p{Mn}|\p{Mc}/u;
33
+ /**
34
+ * 検知前の正規化 (NFKC + 単一桁の漢数字→算用数字) を、原文への対応表つきで行う。
35
+ * 位取りの誤変換を避けるため漢数字は単一桁のみ寄せる。
36
+ *
37
+ * コードポイント単位 (結合文字は直前と合成) で正規化し、出力 1 単位ごとに由来範囲を
38
+ * 記録する。1 文字が複数文字へ展開されても (㍿ → 株式会社) 由来はその 1 文字を指す。
39
+ */
40
+ function normalizeWithMap(raw) {
41
+ let text = '';
42
+ const starts = [];
43
+ const ends = [];
44
+ let i = 0;
45
+ while (i < raw.length) {
46
+ const cp = String.fromCodePoint(raw.codePointAt(i));
47
+ let chunk = cp;
48
+ let len = cp.length;
49
+ // 後続の結合文字を巻き込む (ハ + ゙ を別々に正規化すると バ にならない)。
50
+ while (i + len < raw.length) {
51
+ const next = String.fromCodePoint(raw.codePointAt(i + len));
52
+ if (!COMBINING.test(next))
53
+ break;
54
+ chunk += next;
55
+ len += next.length;
56
+ }
57
+ const norm = KANJI_DIGITS[chunk] ?? chunk.normalize('NFKC');
58
+ for (let k = 0; k < norm.length; k++) {
59
+ starts.push(i);
60
+ ends.push(i + len);
61
+ }
62
+ text += norm;
63
+ i += len;
64
+ }
65
+ return { text, starts, ends };
66
+ }
67
+ /** 検知前の正規化。位取りの誤変換を避けるため単一桁の漢数字のみ寄せる。 */
68
+ function normalizeForDetection(text) {
69
+ return normalizeWithMap(text).text;
70
+ }
71
+ // ---------------------------------------------
72
+ // 検証ヘルパ (誤検知抑制)
73
+ // ---------------------------------------------
74
+ /**
75
+ * 高エントロピー検出の閾値。クレデンシャル判定でも同じ境目を使うので、
76
+ * 検証ヘルパより前に置く (const は巻き上げられない)。
77
+ */
78
+ exports.ENTROPY_MIN_LENGTH = 20;
79
+ exports.ENTROPY_THRESHOLD = 4.0;
80
+ /** クレジットカード番号の Luhn チェック (13〜19 桁)。 */
81
+ function luhnValid(value) {
82
+ const digits = value.replace(/\D/g, '');
83
+ if (digits.length < 13 || digits.length > 19)
84
+ return false;
85
+ let sum = 0;
86
+ let alt = false;
87
+ for (let i = digits.length - 1; i >= 0; i--) {
88
+ let d = Number(digits[i]);
89
+ if (alt) {
90
+ d *= 2;
91
+ if (d > 9)
92
+ d -= 9;
93
+ }
94
+ sum += d;
95
+ alt = !alt;
96
+ }
97
+ return sum % 10 === 0;
98
+ }
99
+ /** マイナンバー (個人番号, 12 桁) のチェックデジット検証。 */
100
+ function isValidMyNumber(value) {
101
+ const d = value.replace(/\D/g, '');
102
+ if (!/^\d{12}$/.test(d))
103
+ return false;
104
+ const body = d.slice(0, 11);
105
+ const check = Number(d[11]);
106
+ let sum = 0;
107
+ for (let n = 1; n <= 11; n++) {
108
+ const pn = Number(body[11 - n]);
109
+ const qn = n <= 6 ? n + 1 : n - 5;
110
+ sum += pn * qn;
111
+ }
112
+ const r = sum % 11;
113
+ const expected = r <= 1 ? 0 : 11 - r;
114
+ return expected === check;
115
+ }
116
+ /** 法人番号 (13 桁) のチェックデジット検証 (先頭 1 桁が検査数字)。 */
117
+ function isValidCorporateNumber(value) {
118
+ const d = value.replace(/\D/g, '');
119
+ if (!/^\d{13}$/.test(d))
120
+ return false;
121
+ const check = Number(d[0]);
122
+ const body = d.slice(1);
123
+ let sum = 0;
124
+ for (let n = 1; n <= 12; n++) {
125
+ const pn = Number(body[12 - n]);
126
+ const qn = n % 2 === 1 ? 1 : 2;
127
+ sum += pn * qn;
128
+ }
129
+ const r = sum % 9;
130
+ const expected = 9 - r;
131
+ return expected === check;
132
+ }
133
+ /**
134
+ * 値の前後に付くコードの記号を落とす。ラベルの後読みは行末のカンマや閉じ括弧まで
135
+ * 値として拾ってしまうため、判定の前に剥がす。
136
+ */
137
+ function trimCodePunctuation(value) {
138
+ return value.replace(/^[<([{'"`]+/, '').replace(/[,;.:)\]}>'"`]+$/, '');
139
+ }
140
+ /**
141
+ * ソースコードの識別子とみなしてよい形か。3 つすべてを満たすときだけ true。
142
+ *
143
+ * 1. 識別子として妥当な字だけでできている (メンバ参照の . を含む)
144
+ * 2. 複合語である (camelCase の境界 / _ / .)
145
+ * 3. **数字を含まない**
146
+ *
147
+ * 3 が効きどころ。実在のクレデンシャルはまず数字が混ざる (S3cr3tValue /
148
+ * keyValue123 / cs_9f8e7d6c5b) のに対し、変数名や引数名は英字だけで綴られる
149
+ * (newToken / config.apiToken / fcm_token_value)。ここを分けないと、
150
+ * 誤検知を潰す代わりに本物のクレデンシャルまで取りこぼす。
151
+ *
152
+ * 2 も要点で、hunter2 のような単語 1 つは弱いパスワードとして実在するため
153
+ * 除外しない。
154
+ */
155
+ function looksLikeCodeIdentifier(value) {
156
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/.test(value))
157
+ return false;
158
+ if (/\d/.test(value))
159
+ return false;
160
+ return /[a-z0-9][A-Z]/.test(value) || value.includes('_') || value.includes('.');
161
+ }
162
+ /**
163
+ * 識別子として扱ってよい上限。これを超える長さ、またはこれ以上のエントロピーを
164
+ * 持つ値は、識別子の形をしていても本物の鍵として扱う (sk_live_51H... 等)。
165
+ *
166
+ * エントロピーの境目は高エントロピー検出と同じ 4.0 bits/char を使う。英単語を
167
+ * つないだ識別子は 15 文字前後で 3.5〜3.7 に収まるので、3.5 では素通りしてしまう。
168
+ *
169
+ * 引き換えに、correct_horse_battery のような **数字を含まないパスフレーズ** は
170
+ * 見逃す。ラベル付きの値しか見ていないルールで両立はできないため、
171
+ * 「作業を止めない」側に倒している。数字を含むもの・単語 1 つのものは従来どおり拾う。
172
+ */
173
+ const CREDENTIAL_IDENTIFIER_MAX_LENGTH = 25;
174
+ const CREDENTIAL_IDENTIFIER_MAX_ENTROPY = exports.ENTROPY_THRESHOLD;
175
+ /** 値とみなす最小の長さ。正規表現側の `{6,}` と揃える。 */
176
+ const CREDENTIAL_MIN_LENGTH = 6;
177
+ /**
178
+ * 汎用クレデンシャルの値が「本物っぽい」か (プレースホルダ/自然文/識別子を弾く)。
179
+ *
180
+ * このルールはラベル (password / secret / token 等) だけを手掛かりにしていて
181
+ * **値の形を問わない**ため、変数への代入というだけのソースコードの記述が
182
+ * そのまま重大度 high に化ける。PreToolUse の deny は無条件ブロックなので、
183
+ * ここでの取りこぼしは「当該ファイルを一切編集できない」に直結する。
184
+ * 値側の足切りをここに集約する。
185
+ */
186
+ function isLikelyCredential(value) {
187
+ const v = value.trim();
188
+ if (v.length < CREDENTIAL_MIN_LENGTH)
189
+ return false;
190
+ if (/^<.*>$/.test(v))
191
+ return false; // <your-secret> 等のプレースホルダ
192
+ if (/^[\W_]+$/.test(v))
193
+ return false; // ***, ----, ____ など記号のみ
194
+ if (/^(.)\1{5,}$/i.test(v))
195
+ return false; // xxxxxx, aaaaaa など同一文字反復
196
+ if (/[()]/.test(v))
197
+ return false; // 関数呼び出し・コード式を除外 (#204 誤検知対策)
198
+ // テンプレート展開・環境変数参照はプレースホルダ。
199
+ if (v.includes('${') || v.includes('{{') || /^\$[A-Za-z_]/.test(v))
200
+ return false;
201
+ // このルールが値とみなす下限は 6 文字。**周囲のコードの記号は文字数に数えない。**
202
+ // 数えてしまうと `id-token: ` + write + バッククォートのような、値が 5 文字しかない
203
+ // 記述が 6 文字として通る (GitHub Actions の権限設定でこの形を実際に踏んだ)。
204
+ const core = trimCodePunctuation(v);
205
+ if (core.length < CREDENTIAL_MIN_LENGTH)
206
+ return false;
207
+ // ソースコードの識別子。短く・エントロピーが低いものだけを落とす
208
+ // (長い/ランダムな値は識別子の形でも本物の鍵として扱う)。
209
+ if (looksLikeCodeIdentifier(core) &&
210
+ core.length < CREDENTIAL_IDENTIFIER_MAX_LENGTH &&
211
+ shannonEntropy(core) < CREDENTIAL_IDENTIFIER_MAX_ENTROPY) {
212
+ return false;
213
+ }
214
+ const word = core.replace(/^[^\p{L}\p{N}]+/u, '').replace(/[^\p{L}\p{N}]+$/u, '').toLowerCase();
215
+ const DENY = new Set([
216
+ 'redacted', 'none', 'null', 'nil', 'true', 'false', 'required', 'optional',
217
+ 'example', 'changeme', 'placeholder', 'password', 'passwd', 'secret', 'token',
218
+ 'your_password', 'yourpassword', 'test', 'enabled', 'disabled', 'undefined', 'empty',
219
+ // 型注釈・スキーマ定義の右辺を弾く。コード断片での誤検知が多い。
220
+ 'boolean', 'string', 'number', 'object', 'unknown', 'never', 'symbol', 'bigint',
221
+ // プレースホルダとして書かれがちな語。
222
+ 'dummy', 'sample', 'todo', 'fixme', 'yourkey', 'your_key', 'xxxxx', 'default', 'unset',
223
+ // 設定ファイルの権限・アクセスレベル。CI の定義ファイルで頻出する。
224
+ 'write', 'read', 'write-all', 'read-all', 'readonly', 'read-only', 'admin', 'public',
225
+ 'private', 'restricted',
226
+ ]);
227
+ return !DENY.has(word);
228
+ }
229
+ /**
230
+ * 銀行口座番号らしさ (T3)。ラベル後読みで拾った 6〜8 桁が、伝票番号や
231
+ * 金額の一部でないことを最低限確認する。全桁同一・連番のダミーは弾く。
232
+ */
233
+ function isLikelyBankAccount(value) {
234
+ const d = value.replace(/\D/g, '');
235
+ if (d.length < 6 || d.length > 8)
236
+ return false;
237
+ if (/^(\d)\1+$/.test(d))
238
+ return false; // 0000000 等
239
+ if (d === '12345678'.slice(0, d.length))
240
+ return false; // 連番のダミー
241
+ return true;
242
+ }
243
+ /** 口座名義らしさ (T3)。カタカナ列で、金融機関名や口座種別の断片を弾く。 */
244
+ function isLikelyAccountHolder(value) {
245
+ const v = value.trim().replace(/[\s ]/g, '');
246
+ if (v.length < 2)
247
+ return false;
248
+ const DENY = ['カブシキガイシャ', 'フツウ', 'トウザ', 'チョキン', 'コウザ', 'シテン', 'ギンコウ'];
249
+ return !DENY.includes(v);
250
+ }
251
+ /**
252
+ * 部署名・組織名の語 (T4)。日本語では「営業部長」と「田中部長」が同じ形になるため、
253
+ * 敬称・役職の直前にこれらが来ても人名として扱わない。
254
+ *
255
+ * 会計仕訳や社内文書はこの形が頻出するので、放置すると「営業部長に確認します」が
256
+ * 毎回「[MASKED_PERSON]部長に確認します」になり、回答が成立しなくなる
257
+ * (改修計画のリスク「誤検知で業務が止まる」)。
258
+ */
259
+ const DEPARTMENT_WORDS = [
260
+ '営業', '経理', '総務', '人事', '労務', '管理', '開発', '製造', '品質', '技術',
261
+ '財務', '法務', '広報', '企画', '事業', '情報', '監査', '購買', '調達', '物流',
262
+ '資材', '生産', '設計', '研究', '販売', '店舗', '本部', '支社', '支店', '部門',
263
+ '部署', '営業所', '事業部',
264
+ ];
265
+ const DEPARTMENT_SUFFIX_RE = new RegExp(`(?:${DEPARTMENT_WORDS.join('|')})$`);
266
+ /**
267
+ * 技術文書・業務文書の一般名詞 (誤検知修正)。人名の位置に来ても人名ではない。
268
+ *
269
+ * 日本語には姓名の区切りがないため、ラベルや敬称の手前にある漢字列を素朴に取ると
270
+ * 一般名詞をそのまま人名として拾う。実際に技術文書の執筆が重大度 high で
271
+ * 繰り返しブロックされた。
272
+ *
273
+ * 2 文字以上の語だけを載せる。1 文字の語 (名 / 値 / 型 など) を入れると
274
+ * 実在の姓まで落ちるため、あえて含めない。
275
+ */
276
+ const GENERIC_NOUN_WORDS = [
277
+ '引数', '関数', '変数', '定数', '名称', '処理', '設定', '情報', '画面', '機能',
278
+ '方法', '手順', '理由', '内容', '結果', '状態', '形式', '仕様', '規則', '条件',
279
+ '対応', '作業', '確認', '実装', '変更', '修正', '追加', '削除', '更新', '参照',
280
+ '取得', '登録', '送信', '受信', '表示', '実行', '検証', '属性', '要素', '配列',
281
+ '文字', '数値', '日時', '日付', '時刻', '単位', '種別', '区分', '分類', '項目',
282
+ '一覧', '詳細', '概要', '例外', '権限', '認証', '承認', '手続', '経路', '範囲',
283
+ ];
284
+ const GENERIC_NOUN_SUFFIX_RE = new RegExp(`(?:${GENERIC_NOUN_WORDS.join('|')})$`);
285
+ /**
286
+ * 人名らしさ (T4)。ラベル・敬称で拾った語から、一般名詞・組織呼称を弾く。
287
+ * 網羅的な人名判定はしない (辞書と学習型辞書で補う設計)。
288
+ */
289
+ function isLikelyPersonName(value) {
290
+ const v = value.trim().replace(/[\s ]/g, '');
291
+ if (v.length < 2 || v.length > 16)
292
+ return false;
293
+ const DENY = new Set([
294
+ 'お客', 'おきゃく', '皆', 'みな', '各位', '御中', '当社', '弊社', '貴社', '御社',
295
+ '担当', '担当者', '責任', '関係', '以下', '上記', '本人', '相手', '先方', '双方',
296
+ '今回', '前回', '次回', '新規', '既存', '該当', '対象', '複数', '全員',
297
+ ]);
298
+ if (DENY.has(v))
299
+ return false;
300
+ // 「第一営業部長」のように修飾が付いても末尾が部署名なら人名ではない。
301
+ if (DEPARTMENT_SUFFIX_RE.test(v))
302
+ return false;
303
+ // 末尾が一般名詞 (引数・関数など) の語は人名ではない。
304
+ if (GENERIC_NOUN_SUFFIX_RE.test(v))
305
+ return false;
306
+ // 「〜すること」「〜ください」等の動詞・助詞で終わる語は人名ではない。
307
+ if (/(?:する|した|して|ます|です|ください|くださ|こと|もの|ため|とき)$/.test(v))
308
+ return false;
309
+ return true;
310
+ }
311
+ // ---------------------------------------------
312
+ // 部品
313
+ // ---------------------------------------------
314
+ /** 都道府県 (住所検出用)。 */
315
+ const PREFECTURES = '北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県|新潟県|富山県|石川県|福井県|山梨県|長野県|岐阜県|静岡県|愛知県|三重県|滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|鳥取県|島根県|岡山県|広島県|山口県|徳島県|香川県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県';
316
+ /** 汎用クレデンシャルのラベル (#204)。 */
317
+ const CREDENTIAL_LABEL = '(?:password|passwd|pwd|secret|token|api[_-]?key|access[_-]?key|client[_-]?secret)';
318
+ /**
319
+ * 金融機関名を構成しうる文字 (T3)。ひらがな行名 (みずほ / ゆうちょ) を拾うために
320
+ * ひらがなを含めるが、助詞 (「取引先の銀行」の「の」) は含めない。助詞を許すと
321
+ * 直前の語まで巻き込んで伏せてしまうため、1 文字ごとに否定先読みで除外する。
322
+ */
323
+ const BANK_NAME_CHAR = '(?:[\\p{sc=Han}\\p{sc=Katakana}ーA-Za-z0-9]|(?![のはがをにとでもやへからまでよりね])[\\p{sc=Hiragana}])';
324
+ /**
325
+ * 口座番号のラベル (T3)。後読みはラベルが数字の直前で終わることを要求するので、
326
+ * 「普通預金 1234567」のように種別が続く表記も明示的に並べる。
327
+ */
328
+ const BANK_ACCOUNT_LABEL = '(?:口座番号|口座No\\.?|普通預金|当座預金|貯蓄預金|総合口座|口座|普通|当座|貯蓄|店番号|店番)';
329
+ /** 口座名義のラベル (T3)。 */
330
+ const ACCOUNT_HOLDER_LABEL = '(?:口座名義|振込先名義|受取人|名義人|名義)';
331
+ /**
332
+ * 人名のラベル (T4)。
333
+ *
334
+ * 「担当」は「担当者」の 1 文字手前でも成立してしまい、「担当者様」で 者 以降を
335
+ * 人名として拾ってしまうため、後続が 者 のときは成立させない。
336
+ */
337
+ const PERSON_LABEL = '(?:取引先担当者|ご担当者|ご担当|担当者|担当(?!者)|氏名|お名前|名前|申請者|承認者|代表者)';
338
+ /**
339
+ * 敬称・役職 (T4)。人名の直後に現れる。漢字 1 文字の敬称 (様 / 氏 / 殿) だけは
340
+ * 熟語ガードが要るので別扱いし、ここには残りを長い語順で並べる
341
+ * (「副社長」を「社長」より先に置かないと、姓に 副 まで巻き込む)。
342
+ */
343
+ const PERSON_TITLE_ONLY = 'さま|さん|副社長|取締役|マネージャー|部長|課長|係長|次長|室長|社長|専務|常務|主任';
344
+ /**
345
+ * 敬称の字が熟語の一部になる語 (誤検知修正)。
346
+ *
347
+ * 日本語の技術文書・業務文書では、敬称に使う漢字 1 文字が熟語の末尾に現れる。
348
+ * ここに挙げた語の形になっているときは敬称として扱わない。実際にこの形で
349
+ * 重大度 high の判定が出て、ファイル生成が繰り返しブロックされた。
350
+ *
351
+ * 語を列挙する方式にしているのは、単純に「直前が漢字なら敬称ではない」と
352
+ * すると、漢字が前置された通常の文で人名を取りこぼすため。判定を落とす範囲を、
353
+ * 実際に熟語を作る字だけに限定する。
354
+ *
355
+ * **姓名の末尾に来る字は載せない。** 藤 + 氏 を入れると「佐藤氏」が、
356
+ * 本 + 殿 を入れると「山本殿」が、大 + 様 を入れると「健大様」が
357
+ * 人名として拾えなくなる。熟語であっても、姓や名の最後の字と衝突するものは諦める。
358
+ */
359
+ const HONORIFIC_COMPOUND_WORDS = [
360
+ '仕様', '模様', '多様', '同様', '一様', '異様', '各様', '態様', '文様', '紋様',
361
+ '有様', '王様', '神様', '奥様', '殿様', '皆様', '客様', '今様', '何様', '貴様',
362
+ '彼氏', '両氏', '姓氏', '華氏', '摂氏',
363
+ '御殿', '拝殿', '仏殿', '湯殿',
364
+ ];
365
+ /** 敬称の字 → その直前に来ると熟語になる字の集合。 */
366
+ const HONORIFIC_COMPOUND_PREFIX = HONORIFIC_COMPOUND_WORDS.reduce((acc, word) => {
367
+ const honorific = word.slice(-1);
368
+ acc[honorific] = (acc[honorific] ?? '') + word.slice(0, -1);
369
+ return acc;
370
+ }, {});
371
+ /**
372
+ * 熟語ガードを入れた敬称の先読み。
373
+ * 先読みの中で後読みを使い、「直前の 1 文字が熟語を作る字ならこの敬称は成立しない」
374
+ * を表す。人名トークンは敬称の直前で終わるので、後読みが見るのはトークンの末尾字。
375
+ */
376
+ const PERSON_HONORIFIC_GUARDED = (() => {
377
+ const guarded = Object.entries(HONORIFIC_COMPOUND_PREFIX).map(([honorific, prefixes]) => `(?<![${prefixes}])${honorific}`);
378
+ return `(?:${guarded.join('|')}|${PERSON_TITLE_ONLY})`;
379
+ })();
380
+ /**
381
+ * 人名として拾う文字クラス (漢字・ひらがな・カタカナ)。姓名の間の空白を1つ許す。
382
+ *
383
+ * 助詞は含めない。含めると「御社の担当者様」「経理部の田中様」で直前の語まで
384
+ * 巻き込んで 1 つの人名として伏せてしまい、除外リストも素通りする
385
+ * (BANK_NAME_CHAR と同じ手法で 1 文字ごとに否定先読みで除外する)。
386
+ */
387
+ const NAME_HEAD = '[\\p{sc=Han}\\p{sc=Katakana}]';
388
+ const NAME_CHAR = '(?:[\\p{sc=Han}\\p{sc=Katakana}ー]|(?![のはがをにとでもやへ])[\\p{sc=Hiragana}])';
389
+ const NAME_TOKEN = `${NAME_HEAD}${NAME_CHAR}{0,7}(?:[ \\u3000]${NAME_HEAD}${NAME_CHAR}{0,7})?`;
390
+ /** 秘密鍵は BEGIN 行だけでなく本体ごと伏せる (#104)。 */
391
+ exports.PEM_BLOCK_SOURCE = '-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----';
392
+ /** Shannon エントロピー (bits/char)。 */
393
+ function shannonEntropy(s) {
394
+ if (s.length === 0)
395
+ return 0;
396
+ const freq = {};
397
+ for (const ch of s)
398
+ freq[ch] = (freq[ch] ?? 0) + 1;
399
+ let e = 0;
400
+ for (const k of Object.keys(freq)) {
401
+ const p = freq[k] / s.length;
402
+ e -= p * Math.log2(p);
403
+ }
404
+ return e;
405
+ }
406
+ // ---------------------------------------------
407
+ // ルール表
408
+ // ---------------------------------------------
409
+ // 順序に意味がある: 特異的なルールを先に置き、後段の汎用ルールとスパンが重なった
410
+ // ときは先勝ちで採用する (detect の secret 重複除外 / redact の非重複選択が使う)。
411
+ exports.DETECTION_RULES = [
412
+ // --- シークレット ---
413
+ {
414
+ ruleId: 'anthropic_key', category: 'secret', severity: 'high', maskGroup: 'secret',
415
+ source: 'sk-ant-(?:api|oat|ort)\\d+-[A-Za-z0-9_-]{40,}',
416
+ redaction: '[MASKED_ANTHROPIC_KEY]',
417
+ },
418
+ {
419
+ ruleId: 'openai_key', category: 'secret', severity: 'high', maskGroup: 'secret',
420
+ source: 'sk-(?!ant-)(?:proj-)?[A-Za-z0-9]{40,}',
421
+ redaction: '[MASKED_OPENAI_KEY]',
422
+ },
423
+ {
424
+ ruleId: 'github_token', category: 'secret', severity: 'high', maskGroup: 'secret',
425
+ source: 'gh[pousr]_[A-Za-z0-9]{36}',
426
+ redaction: '[MASKED_GITHUB_TOKEN]',
427
+ },
428
+ {
429
+ ruleId: 'slack_token', category: 'secret', severity: 'high', maskGroup: 'secret',
430
+ source: 'xox[baprs]-[A-Za-z0-9-]{10,}',
431
+ redaction: '[MASKED_SLACK_TOKEN]',
432
+ },
433
+ {
434
+ ruleId: 'aws_access_key', category: 'secret', severity: 'high', maskGroup: 'secret',
435
+ source: '\\bAKIA[0-9A-Z]{16}\\b',
436
+ redaction: '[MASKED_AWS_KEY]',
437
+ },
438
+ {
439
+ ruleId: 'gcp_api_key', category: 'secret', severity: 'high', maskGroup: 'secret',
440
+ source: '\\bAIza[0-9A-Za-z_-]{35}\\b',
441
+ redaction: '[MASKED_GCP_KEY]',
442
+ },
443
+ {
444
+ ruleId: 'private_key_block', category: 'secret', severity: 'high', maskGroup: 'secret',
445
+ source: '-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----',
446
+ redaction: '[MASKED_PRIVATE_KEY]',
447
+ },
448
+ {
449
+ ruleId: 'jwt', category: 'secret', severity: 'medium', maskGroup: 'secret',
450
+ source: '\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b',
451
+ redaction: '[MASKED_JWT]',
452
+ },
453
+ {
454
+ ruleId: 'bearer_token', category: 'secret', severity: 'medium', maskGroup: 'secret',
455
+ source: 'Bearer\\s+[A-Za-z0-9._-]{20,}',
456
+ redaction: 'Bearer [MASKED_TOKEN]',
457
+ },
458
+ {
459
+ // #204: ラベル付きクレデンシャル。後読みでラベルを残し、値のみを伏せる。
460
+ ruleId: 'generic_credential', category: 'secret', severity: 'high', maskGroup: 'secret',
461
+ source: `(?<=\\b${CREDENTIAL_LABEL}\\s*[:=:=]\\s*["']?)[^\\s"']{6,}`,
462
+ flags: 'gi',
463
+ validator: 'credential',
464
+ redaction: '[MASKED_CREDENTIAL]',
465
+ },
466
+ // --- PII (汎用) ---
467
+ {
468
+ ruleId: 'credit_card', category: 'pii', severity: 'high', maskGroup: 'strong_pii',
469
+ source: '\\b(?:\\d[ -]?){12,18}\\d\\b',
470
+ validator: 'luhn',
471
+ redaction: '[MASKED_CREDIT_CARD]',
472
+ },
473
+ {
474
+ ruleId: 'email', category: 'pii', severity: 'low', maskGroup: 'email',
475
+ source: '[a-zA-Z0-9._%+-]{2,}@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}',
476
+ redaction: '[MASKED_EMAIL]',
477
+ },
478
+ // --- 日本語 PII (APPI の個人情報・個人識別符号) ---
479
+ {
480
+ ruleId: 'jp_mynumber', category: 'pii_jp', severity: 'high', maskGroup: 'strong_pii',
481
+ source: '\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b',
482
+ validator: 'mynumber',
483
+ redaction: '[MASKED_MYNUMBER]',
484
+ },
485
+ // --- 金融 (T3: 会計仕訳の中核) ---
486
+ // 口座番号はラベル後読みで値のみを拾う。ラベルを残すことで、伏せても文意が保たれる。
487
+ {
488
+ ruleId: 'jp_bank_account', category: 'pii_jp', severity: 'high', maskGroup: 'strong_pii',
489
+ source: `(?<=${BANK_ACCOUNT_LABEL}\\s*[::]?\\s*)\\d{6,8}(?![\\d-])`,
490
+ validator: 'bankAccount',
491
+ redaction: '[MASKED_BANK_ACCOUNT]',
492
+ },
493
+ {
494
+ ruleId: 'jp_bank_branch', category: 'pii_jp', severity: 'high', maskGroup: 'strong_pii',
495
+ source: `${BANK_NAME_CHAR}{1,12}(?:銀行|信用金庫|信用組合|農業協同組合|労働金庫|信組|信金)(?:[ \\u3000]?${BANK_NAME_CHAR}{1,12}(?:支店|出張所|営業部))?`,
496
+ flags: 'gu',
497
+ redaction: '[MASKED_BANK]',
498
+ },
499
+ {
500
+ ruleId: 'jp_account_holder', category: 'pii_jp', severity: 'high', maskGroup: 'strong_pii',
501
+ source: `(?<=${ACCOUNT_HOLDER_LABEL}\\s*[::]?\\s*)[\\p{sc=Katakana}ー]{2,10}(?:[ \\u3000][\\p{sc=Katakana}ー]{1,10})?`,
502
+ flags: 'gu',
503
+ validator: 'accountHolder',
504
+ redaction: '[MASKED_ACCOUNT_HOLDER]',
505
+ },
506
+ // --- 人名 (T4) ---
507
+ // 網羅的な NER はしない。ラベルと敬称という確実な手掛かりのみを使い、
508
+ // 取りこぼしは辞書 (T5) と学習型辞書 (R2) で補う設計。
509
+ //
510
+ // 重大度が medium なのは意図的。検査数字で裏を取れるマイナンバー・カード番号と違い、
511
+ // 人名はラベルと敬称という状況証拠だけで判定していて、構造的に誤検知しうる。
512
+ // PreToolUse の deny は無条件ブロックなので、high のままだと 1 件の誤検知が
513
+ // 「ファイルを一切編集できない」に化ける。マスクは severity ではなく maskGroup で
514
+ // 決まるので、medium に下げてもクラウド送信前のマスクは従来どおり働く。
515
+ {
516
+ ruleId: 'jp_person_name', category: 'pii_jp', severity: 'medium', maskGroup: 'strong_pii',
517
+ // ラベルと人名の間に **区切りを必須** にする。区切りを任意にすると、ラベルと
518
+ // 同じ字で始まる技術用語が「ラベル + 人名」として成立してしまう。
519
+ // 区切りなしで姓名が続く表記は敬称ルールと辞書 (T5) で拾う。
520
+ source: `(?<=${PERSON_LABEL}(?:\\s*(?:は|が|[::==、,・])\\s*|[ \\u3000「『((]+))${NAME_TOKEN}`,
521
+ flags: 'gu',
522
+ validator: 'personName',
523
+ redaction: '[MASKED_PERSON]',
524
+ },
525
+ {
526
+ ruleId: 'jp_person_name_honorific', category: 'pii_jp', severity: 'medium', maskGroup: 'strong_pii',
527
+ source: `${NAME_TOKEN}(?=${PERSON_HONORIFIC_GUARDED})`,
528
+ flags: 'gu',
529
+ validator: 'personName',
530
+ redaction: '[MASKED_PERSON]',
531
+ },
532
+ // --- 連絡先系 (agent は既定で伏せず、ブラウザは伏せる) ---
533
+ {
534
+ ruleId: 'jp_corporate_number', category: 'pii_jp', severity: 'medium', maskGroup: 'contact_pii',
535
+ source: '\\b\\d{13}\\b',
536
+ validator: 'corporate',
537
+ redaction: '[MASKED_CORPORATE_NUMBER]',
538
+ },
539
+ {
540
+ ruleId: 'jp_phone', category: 'pii_jp', severity: 'medium', maskGroup: 'contact_pii',
541
+ source: '\\b0[789]0-\\d{4}-\\d{4}\\b|\\b0120-\\d{3}-\\d{3}\\b|\\b0800-\\d{3}-\\d{4}\\b|\\b0\\d{1,3}-\\d{2,4}-\\d{4}\\b',
542
+ redaction: '[MASKED_PHONE]',
543
+ },
544
+ {
545
+ ruleId: 'jp_address', category: 'pii_jp', severity: 'medium', maskGroup: 'contact_pii',
546
+ source: `(?:${PREFECTURES})[^\\s「」、。]{0,18}?[市区町村郡][^\\s「」、。]{0,20}?(?:\\d+|[十百千]+)(?:丁目|番地|番|-|−)`,
547
+ redaction: '[MASKED_ADDRESS]',
548
+ },
549
+ {
550
+ ruleId: 'jp_postal', category: 'pii_jp', severity: 'low', maskGroup: 'contact_pii',
551
+ source: '(?<![\\d-])(?:〒\\s?)?\\d{3}-\\d{4}(?![\\d-])',
552
+ redaction: '[MASKED_POSTAL]',
553
+ },
554
+ // --- 検知のみ (マスクすると文意が壊れる) ---
555
+ {
556
+ ruleId: 'jp_wareki_date', category: 'pii_jp', severity: 'low', maskGroup: null,
557
+ source: '(?:令和|平成|昭和|大正|明治)\\s?(?:元|\\d{1,2})\\s?年(?:\\s?\\d{1,2}\\s?月(?:\\s?\\d{1,2}\\s?日)?)?',
558
+ redaction: '[MASKED_DATE]',
559
+ },
560
+ ];
561
+ /** 高エントロピー検出の擬似ルール (正規表現ではなくトークン走査で拾う)。 */
562
+ exports.HIGH_ENTROPY_RULE = {
563
+ ruleId: 'high_entropy',
564
+ category: 'secret',
565
+ severity: 'medium',
566
+ redaction: '[MASKED_SECRET]',
567
+ };
568
+ exports.VALIDATORS = {
569
+ luhn: luhnValid,
570
+ mynumber: isValidMyNumber,
571
+ corporate: isValidCorporateNumber,
572
+ credential: isLikelyCredential,
573
+ bankAccount: isLikelyBankAccount,
574
+ personName: isLikelyPersonName,
575
+ accountHolder: isLikelyAccountHolder,
576
+ };
577
+ /** ruleId → 置換ラベル。未知の ruleId は [MASKED_<RULEID>] に倒す。 */
578
+ function redactionLabel(ruleId) {
579
+ const spec = exports.DETECTION_RULES.find((r) => r.ruleId === ruleId);
580
+ if (spec)
581
+ return spec.redaction;
582
+ if (ruleId === exports.HIGH_ENTROPY_RULE.ruleId)
583
+ return exports.HIGH_ENTROPY_RULE.redaction;
584
+ return `[MASKED_${ruleId.toUpperCase()}]`;
585
+ }
586
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/detection/rules.ts"],"names":[],"mappings":"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"}