promptkaizen-agent 0.2.0 → 0.3.1

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 (176) hide show
  1. package/README.md +5 -1
  2. package/dist/backfill/run.d.ts +15 -0
  3. package/dist/backfill/run.d.ts.map +1 -0
  4. package/dist/backfill/run.js +33 -0
  5. package/dist/backfill/run.js.map +1 -0
  6. package/dist/backfill/scanner.d.ts +82 -0
  7. package/dist/backfill/scanner.d.ts.map +1 -0
  8. package/dist/backfill/scanner.js +271 -0
  9. package/dist/backfill/scanner.js.map +1 -0
  10. package/dist/cli/detect.d.ts +2 -0
  11. package/dist/cli/detect.d.ts.map +1 -0
  12. package/dist/cli/detect.js +40 -0
  13. package/dist/cli/detect.js.map +1 -0
  14. package/dist/cli/disable.d.ts +2 -0
  15. package/dist/cli/disable.d.ts.map +1 -0
  16. package/dist/cli/disable.js +44 -0
  17. package/dist/cli/disable.js.map +1 -0
  18. package/dist/cli/enable.d.ts +2 -0
  19. package/dist/cli/enable.d.ts.map +1 -0
  20. package/dist/cli/enable.js +105 -0
  21. package/dist/cli/enable.js.map +1 -0
  22. package/dist/cli/hook.d.ts +2 -0
  23. package/dist/cli/hook.d.ts.map +1 -0
  24. package/dist/cli/hook.js +406 -0
  25. package/dist/cli/hook.js.map +1 -0
  26. package/dist/cli/init.d.ts.map +1 -1
  27. package/dist/cli/init.js +70 -8
  28. package/dist/cli/init.js.map +1 -1
  29. package/dist/cli/install-hooks.d.ts +5 -0
  30. package/dist/cli/install-hooks.d.ts.map +1 -0
  31. package/dist/cli/install-hooks.js +132 -0
  32. package/dist/cli/install-hooks.js.map +1 -0
  33. package/dist/cli/install-task.d.ts +28 -0
  34. package/dist/cli/install-task.d.ts.map +1 -0
  35. package/dist/cli/install-task.js +119 -0
  36. package/dist/cli/install-task.js.map +1 -0
  37. package/dist/cli/mcp.d.ts +2 -0
  38. package/dist/cli/mcp.d.ts.map +1 -0
  39. package/dist/cli/mcp.js +148 -0
  40. package/dist/cli/mcp.js.map +1 -0
  41. package/dist/cli/metrics.d.ts +2 -0
  42. package/dist/cli/metrics.d.ts.map +1 -0
  43. package/dist/cli/metrics.js +103 -0
  44. package/dist/cli/metrics.js.map +1 -0
  45. package/dist/cli/report.d.ts +2 -0
  46. package/dist/cli/report.d.ts.map +1 -0
  47. package/dist/cli/report.js +211 -0
  48. package/dist/cli/report.js.map +1 -0
  49. package/dist/cli/scan.d.ts +2 -0
  50. package/dist/cli/scan.d.ts.map +1 -0
  51. package/dist/cli/scan.js +171 -0
  52. package/dist/cli/scan.js.map +1 -0
  53. package/dist/cli/start.d.ts.map +1 -1
  54. package/dist/cli/start.js +70 -17
  55. package/dist/cli/start.js.map +1 -1
  56. package/dist/cli/status.d.ts.map +1 -1
  57. package/dist/cli/status.js +82 -18
  58. package/dist/cli/status.js.map +1 -1
  59. package/dist/cli/uninstall-task.d.ts +8 -0
  60. package/dist/cli/uninstall-task.d.ts.map +1 -0
  61. package/dist/cli/uninstall-task.js +44 -0
  62. package/dist/cli/uninstall-task.js.map +1 -0
  63. package/dist/config.d.ts +172 -6
  64. package/dist/config.d.ts.map +1 -1
  65. package/dist/config.js +114 -2
  66. package/dist/config.js.map +1 -1
  67. package/dist/console-safe.d.ts +21 -0
  68. package/dist/console-safe.d.ts.map +1 -0
  69. package/dist/console-safe.js +71 -0
  70. package/dist/console-safe.js.map +1 -0
  71. package/dist/detection-secret.d.ts.map +1 -1
  72. package/dist/detection-secret.js +12 -0
  73. package/dist/detection-secret.js.map +1 -1
  74. package/dist/env-detect.d.ts +44 -0
  75. package/dist/env-detect.d.ts.map +1 -0
  76. package/dist/env-detect.js +151 -0
  77. package/dist/env-detect.js.map +1 -0
  78. package/dist/exec/executor.d.ts +42 -0
  79. package/dist/exec/executor.d.ts.map +1 -0
  80. package/dist/exec/executor.js +135 -0
  81. package/dist/exec/executor.js.map +1 -0
  82. package/dist/exec/pk-execute.d.ts +30 -0
  83. package/dist/exec/pk-execute.d.ts.map +1 -0
  84. package/dist/exec/pk-execute.js +174 -0
  85. package/dist/exec/pk-execute.js.map +1 -0
  86. package/dist/exec/policy-fetcher.d.ts +9 -0
  87. package/dist/exec/policy-fetcher.d.ts.map +1 -0
  88. package/dist/exec/policy-fetcher.js +46 -0
  89. package/dist/exec/policy-fetcher.js.map +1 -0
  90. package/dist/exec/policy.d.ts +32 -0
  91. package/dist/exec/policy.d.ts.map +1 -0
  92. package/dist/exec/policy.js +88 -0
  93. package/dist/exec/policy.js.map +1 -0
  94. package/dist/hooks/block-store.d.ts +14 -0
  95. package/dist/hooks/block-store.d.ts.map +1 -0
  96. package/dist/hooks/block-store.js +26 -0
  97. package/dist/hooks/block-store.js.map +1 -0
  98. package/dist/hooks/claude-hook.d.ts +55 -0
  99. package/dist/hooks/claude-hook.d.ts.map +1 -0
  100. package/dist/hooks/claude-hook.js +122 -0
  101. package/dist/hooks/claude-hook.js.map +1 -0
  102. package/dist/hooks/continuity.d.ts +48 -0
  103. package/dist/hooks/continuity.d.ts.map +1 -0
  104. package/dist/hooks/continuity.js +92 -0
  105. package/dist/hooks/continuity.js.map +1 -0
  106. package/dist/hooks/observation.d.ts +27 -0
  107. package/dist/hooks/observation.d.ts.map +1 -0
  108. package/dist/hooks/observation.js +0 -0
  109. package/dist/hooks/observation.js.map +1 -0
  110. package/dist/hooks/platforms.d.ts +24 -0
  111. package/dist/hooks/platforms.d.ts.map +1 -0
  112. package/dist/hooks/platforms.js +57 -0
  113. package/dist/hooks/platforms.js.map +1 -0
  114. package/dist/hooks/read-cache.d.ts +71 -0
  115. package/dist/hooks/read-cache.d.ts.map +1 -0
  116. package/dist/hooks/read-cache.js +166 -0
  117. package/dist/hooks/read-cache.js.map +1 -0
  118. package/dist/hooks/reduction.d.ts +78 -0
  119. package/dist/hooks/reduction.d.ts.map +1 -0
  120. package/dist/hooks/reduction.js +111 -0
  121. package/dist/hooks/reduction.js.map +1 -0
  122. package/dist/hooks/settings-merge.d.ts +32 -0
  123. package/dist/hooks/settings-merge.d.ts.map +1 -0
  124. package/dist/hooks/settings-merge.js +74 -0
  125. package/dist/hooks/settings-merge.js.map +1 -0
  126. package/dist/hooks/snapshot.d.ts +37 -0
  127. package/dist/hooks/snapshot.d.ts.map +1 -0
  128. package/dist/hooks/snapshot.js +180 -0
  129. package/dist/hooks/snapshot.js.map +1 -0
  130. package/dist/index.js +51 -0
  131. package/dist/index.js.map +1 -1
  132. package/dist/mcp/server.d.ts +118 -0
  133. package/dist/mcp/server.d.ts.map +1 -0
  134. package/dist/mcp/server.js +240 -0
  135. package/dist/mcp/server.js.map +1 -0
  136. package/dist/onboarding-report.d.ts +66 -0
  137. package/dist/onboarding-report.d.ts.map +1 -0
  138. package/dist/onboarding-report.js +152 -0
  139. package/dist/onboarding-report.js.map +1 -0
  140. package/dist/onboarding.d.ts +55 -0
  141. package/dist/onboarding.d.ts.map +1 -0
  142. package/dist/onboarding.js +98 -0
  143. package/dist/onboarding.js.map +1 -0
  144. package/dist/pii-masker.d.ts +7 -0
  145. package/dist/pii-masker.d.ts.map +1 -1
  146. package/dist/pii-masker.js +27 -51
  147. package/dist/pii-masker.js.map +1 -1
  148. package/dist/privacy.d.ts +13 -0
  149. package/dist/privacy.d.ts.map +1 -0
  150. package/dist/privacy.js +67 -0
  151. package/dist/privacy.js.map +1 -0
  152. package/dist/residency.d.ts +21 -0
  153. package/dist/residency.d.ts.map +1 -0
  154. package/dist/residency.js +68 -0
  155. package/dist/residency.js.map +1 -0
  156. package/dist/secret-detector.d.ts +19 -0
  157. package/dist/secret-detector.d.ts.map +1 -1
  158. package/dist/secret-detector.js +116 -0
  159. package/dist/secret-detector.js.map +1 -1
  160. package/dist/store/local-store.d.ts +167 -0
  161. package/dist/store/local-store.d.ts.map +1 -0
  162. package/dist/store/local-store.js +538 -0
  163. package/dist/store/local-store.js.map +1 -0
  164. package/dist/store/schema.d.ts +38 -0
  165. package/dist/store/schema.d.ts.map +1 -0
  166. package/dist/store/schema.js +189 -0
  167. package/dist/store/schema.js.map +1 -0
  168. package/dist/types.d.ts +13 -2
  169. package/dist/types.d.ts.map +1 -1
  170. package/dist/version.d.ts +1 -1
  171. package/dist/version.js +1 -1
  172. package/dist/watcher.d.ts +6 -0
  173. package/dist/watcher.d.ts.map +1 -1
  174. package/dist/watcher.js +13 -2
  175. package/dist/watcher.js.map +1 -1
  176. package/package.json +4 -2
package/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # @promptkaizen/agent
2
2
 
3
3
  PromptKaizen のローカル常駐エージェント。`~/.claude/projects/*.jsonl` を監視し、
4
- 差分パース・PII マスキング・バッチング後に PromptKaizen Cloud へ送信する。
4
+ 差分パース・PII マスキング後に **ローカル SQLite(FTS5) へ保存** し、
5
+ トークン設定時のみ PromptKaizen Cloud へ送信する (未設定なら完全ローカル動作)。
6
+ ローカル DB にも生 PII / 生機密は残さない。詳細は `docs/local-store.md`。
5
7
 
6
8
  ## なぜローカルエージェントなのか
7
9
 
@@ -75,6 +77,8 @@ PK_API_KEY=pk_xxxxx PK_ENV=stg ./scripts/install-agent.sh
75
77
  | `uninstall-launchd` | [macOS] launchd 登録を解除 (config/offsets は残す) |
76
78
  | `install-systemd` | [Linux] systemd user unit に登録 (自動起動 + 落ちたら再起動) |
77
79
  | `uninstall-systemd` | [Linux] systemd 登録を解除 (config/offsets は残す) |
80
+ | `install-task` | [Windows] Task Scheduler に登録 (ログオン起動 + 5分毎 watchdog) |
81
+ | `uninstall-task` | [Windows] Task Scheduler 登録を解除 (config/offsets は残す) |
78
82
  | `version` | バージョン表示 |
79
83
  | `help` | ヘルプ |
80
84
 
@@ -0,0 +1,15 @@
1
+ import type { AgentConfig } from '../config';
2
+ import { type BackfillFile, type ScanSummary } from './scanner';
3
+ export interface BackfillRunOptions {
4
+ budgetMs: number;
5
+ maxFiles: number;
6
+ onProgress?: (scanned: number, total: number) => void;
7
+ }
8
+ export interface BackfillRunResult {
9
+ files: BackfillFile[];
10
+ /** files が空のときは null (呼び出し側で「履歴なし」分岐できる)。 */
11
+ summary: ScanSummary | null;
12
+ }
13
+ /** config から検知器/マスカを構築し、列挙 → スキャンまで実行する。 */
14
+ export declare function executeBackfill(config: AgentConfig, opts: BackfillRunOptions): Promise<BackfillRunResult>;
15
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/backfill/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAI5C,OAAO,EAAwC,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AASrG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACtD;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,6CAA6C;IAC7C,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;CAC5B;AAED,4CAA4C;AAC5C,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAwB5B"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeBackfill = executeBackfill;
4
+ const detection_secret_1 = require("../detection-secret");
5
+ const pii_masker_1 = require("../pii-masker");
6
+ const secret_detector_1 = require("../secret-detector");
7
+ const scanner_1 = require("./scanner");
8
+ /** config から検知器/マスカを構築し、列挙 → スキャンまで実行する。 */
9
+ async function executeBackfill(config, opts) {
10
+ // スキャンの目的は検知そのものなので config.detection.enabled に関わらず detector を作る。
11
+ // 辞書・エントロピー設定・ローカル HMAC 鍵は config に従う (検知ロジックは #42 と同一)。
12
+ const detector = new secret_detector_1.SecretDetector({
13
+ customDictionary: config.detection.customDictionary,
14
+ enableEntropy: config.detection.enableEntropy,
15
+ hmacSecret: await (0, detection_secret_1.loadOrCreateDetectionSecret)(config.detection.hmacSecret),
16
+ });
17
+ // 表示マスク用 (セッション名 / cwd)。バックフィルは高速・オフライン前提なので
18
+ // 組織ルールの cloud 同期はせず、ローカル設定のみでマスクする。
19
+ const masker = new pii_masker_1.PiiMasker(config.pii);
20
+ const files = await (0, scanner_1.enumerateBackfillFiles)(config.watchPaths, config.exclude);
21
+ if (files.length === 0)
22
+ return { files, summary: null };
23
+ const summary = await (0, scanner_1.scanBackfill)(files, {
24
+ detector,
25
+ masker,
26
+ budgetMs: opts.budgetMs,
27
+ maxFiles: opts.maxFiles,
28
+ maxBytesPerFile: config.backfill.maxBytesPerFile,
29
+ onProgress: opts.onProgress,
30
+ });
31
+ return { files, summary };
32
+ }
33
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/backfill/run.ts"],"names":[],"mappings":";;AA0BA,0CA2BC;AApDD,0DAAiE;AACjE,8CAAyC;AACzC,wDAAmD;AACnD,uCAAqG;AAqBrG,4CAA4C;AACrC,KAAK,UAAU,eAAe,CACnC,MAAmB,EACnB,IAAwB;IAExB,iEAAiE;IACjE,yDAAyD;IACzD,MAAM,QAAQ,GAAG,IAAI,gCAAc,CAAC;QAClC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,gBAAgB;QACnD,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,aAAa;QAC7C,UAAU,EAAE,MAAM,IAAA,8CAA2B,EAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;KAC3E,CAAC,CAAA;IACF,6CAA6C;IAC7C,qCAAqC;IACrC,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAExC,MAAM,KAAK,GAAG,MAAM,IAAA,gCAAsB,EAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAEvD,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAY,EAAC,KAAK,EAAE;QACxC,QAAQ;QACR,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;QAChD,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;IACF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,82 @@
1
+ import type { PiiMasker } from '../pii-masker';
2
+ import { type DetectionMeta, type DetectionSeverity, type SecretDetector } from '../secret-detector';
3
+ import type { ObservationSource } from '../types';
4
+ export interface BackfillFile {
5
+ filepath: string;
6
+ source: ObservationSource;
7
+ sizeBytes: number;
8
+ mtimeMs: number;
9
+ }
10
+ export interface ScanHit {
11
+ filepath: string;
12
+ source: ObservationSource;
13
+ /** 表示用セッション名 (マスク済み)。例: `promptkaizen-mvp · 1a2b3c4d`。 */
14
+ sessionLabel: string;
15
+ sessionId: string | null;
16
+ /** entry のタイムスタンプ (ISO)。無ければファイル mtime にフォールバック。 */
17
+ timestamp: string | null;
18
+ lineNumber: number;
19
+ /** 検知メタ (マスク済みプレビュー + ハッシュのみ。生機密本文なし)。 */
20
+ detections: DetectionMeta[];
21
+ /** この entry 内の最大重大度 (ソート用)。 */
22
+ maxSeverity: DetectionSeverity;
23
+ }
24
+ export interface ScanCounts {
25
+ high: number;
26
+ medium: number;
27
+ low: number;
28
+ }
29
+ export interface ScanSummary {
30
+ /** glob にマッチした候補ファイル総数。 */
31
+ filesTotal: number;
32
+ /** 実際にスキャンしたファイル数。 */
33
+ filesScanned: number;
34
+ /** サイズ上限超過でスキップした数。 */
35
+ filesSkippedSize: number;
36
+ /** maxFiles 超過 (直近優先の枠外) でスキップした数。 */
37
+ filesSkippedCap: number;
38
+ /** タイムボックス超過でスキャンしなかった数。 */
39
+ filesSkippedTimeout: number;
40
+ /** スキャンした entry 総数。 */
41
+ entriesScanned: number;
42
+ /** 検知が 1 件以上あった entry 数。 */
43
+ hitEntries: number;
44
+ /** 重大度別の検知出現回数の合計 (DetectionMeta.count の総和)。 */
45
+ counts: ScanCounts;
46
+ /** 検知ヒット (重大度降順 → 日時降順)。表示上限の切り詰めは呼び出し側で行う。 */
47
+ hits: ScanHit[];
48
+ elapsedMs: number;
49
+ /** タイムボックス超過で打ち切ったか。 */
50
+ timedOut: boolean;
51
+ }
52
+ export interface ScanOptions {
53
+ detector: SecretDetector;
54
+ /** セッション名 / cwd の表示マスク用。 */
55
+ masker: PiiMasker;
56
+ /** 総時間予算 (ms)。超過でそこまでの結果を返す。 */
57
+ budgetMs: number;
58
+ /** スキャン対象ファイルの上限 (直近 mtime 順)。 */
59
+ maxFiles: number;
60
+ /** この UTF-8 バイト数を超えるファイルはスキップ。 */
61
+ maxBytesPerFile: number;
62
+ /** 進捗コールバック (1 ファイル処理後ごとに呼ばれる)。 */
63
+ onProgress?: (scanned: number, total: number) => void;
64
+ /** テスト用の時計注入 (既定 Date.now)。 */
65
+ now?: () => number;
66
+ }
67
+ /**
68
+ * watchPaths (glob) にマッチする既存ファイルを列挙し、mtime 降順 (直近優先) で返す。
69
+ * exclude glob にマッチするものは除外する。
70
+ */
71
+ export declare function enumerateBackfillFiles(watchPaths: string[], exclude?: string[]): Promise<BackfillFile[]>;
72
+ /**
73
+ * 過去ログを一括スキャンして検知レポートを返す。
74
+ * files は直近優先 (mtime 降順) で並んでいることを前提とする
75
+ * (enumerateBackfillFiles の出力をそのまま渡す)。
76
+ */
77
+ export declare function scanBackfill(files: BackfillFile[], opts: ScanOptions): Promise<ScanSummary>;
78
+ /** glob を正規表現に変換する。`**` はパス区切りを跨ぐ、`*`/`?` は跨がない。 */
79
+ export declare function globToRegExp(glob: string): RegExp;
80
+ /** glob の先頭の固定 (ワイルドカードを含まない) ディレクトリ部分を返す。 */
81
+ export declare function globBaseDir(glob: string): string;
82
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/backfill/scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEpH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAmBjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iBAAiB,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iBAAiB,CAAA;IACzB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,oDAAoD;IACpD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,0CAA0C;IAC1C,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,+BAA+B;IAC/B,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,sBAAsB;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,uBAAuB;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAA;IACvB,4BAA4B;IAC5B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,MAAM,EAAE,UAAU,CAAA;IAClB,+CAA+C;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,CAAA;IACxB,4BAA4B;IAC5B,MAAM,EAAE,SAAS,CAAA;IACjB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,mCAAmC;IACnC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAMD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,GAAE,MAAM,EAAO,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgCzB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAyDjG;AAqGD,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBjD;AAED,8CAA8C;AAC9C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYhD"}
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enumerateBackfillFiles = enumerateBackfillFiles;
7
+ exports.scanBackfill = scanBackfill;
8
+ exports.globToRegExp = globToRegExp;
9
+ exports.globBaseDir = globBaseDir;
10
+ const fs_1 = require("fs");
11
+ const promises_1 = __importDefault(require("fs/promises"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const readline_1 = __importDefault(require("readline"));
14
+ const secret_detector_1 = require("../secret-detector");
15
+ const source_1 = require("../source");
16
+ const SEVERITY_RANK = { high: 0, medium: 1, low: 2 };
17
+ // 1 ファイル内でこの行数ごとにタイムボックスを確認する (巨大ファイルで予算を食い潰さない)。
18
+ const TIME_CHECK_EVERY_LINES = 2_000;
19
+ /**
20
+ * watchPaths (glob) にマッチする既存ファイルを列挙し、mtime 降順 (直近優先) で返す。
21
+ * exclude glob にマッチするものは除外する。
22
+ */
23
+ async function enumerateBackfillFiles(watchPaths, exclude = []) {
24
+ const excludeRes = exclude.map(globToRegExp);
25
+ const seen = new Set();
26
+ const out = [];
27
+ for (const glob of watchPaths) {
28
+ const normGlob = glob.replace(/\\/g, '/');
29
+ const re = globToRegExp(normGlob);
30
+ const base = globBaseDir(normGlob);
31
+ for await (const filepath of walk(base)) {
32
+ const norm = filepath.replace(/\\/g, '/');
33
+ if (!re.test(norm))
34
+ continue;
35
+ if (excludeRes.some((x) => x.test(norm)))
36
+ continue;
37
+ if (seen.has(filepath))
38
+ continue;
39
+ seen.add(filepath);
40
+ try {
41
+ const st = await promises_1.default.stat(filepath);
42
+ if (!st.isFile())
43
+ continue;
44
+ out.push({
45
+ filepath,
46
+ source: (0, source_1.detectSource)(filepath),
47
+ sizeBytes: st.size,
48
+ mtimeMs: st.mtimeMs,
49
+ });
50
+ }
51
+ catch {
52
+ // 列挙と stat の間に消えたファイル等は無視。
53
+ }
54
+ }
55
+ }
56
+ out.sort((a, b) => b.mtimeMs - a.mtimeMs);
57
+ return out;
58
+ }
59
+ /**
60
+ * 過去ログを一括スキャンして検知レポートを返す。
61
+ * files は直近優先 (mtime 降順) で並んでいることを前提とする
62
+ * (enumerateBackfillFiles の出力をそのまま渡す)。
63
+ */
64
+ async function scanBackfill(files, opts) {
65
+ const now = opts.now ?? Date.now;
66
+ const start = now();
67
+ const deadline = start + opts.budgetMs;
68
+ const summary = {
69
+ filesTotal: files.length,
70
+ filesScanned: 0,
71
+ filesSkippedSize: 0,
72
+ filesSkippedCap: 0,
73
+ filesSkippedTimeout: 0,
74
+ entriesScanned: 0,
75
+ hitEntries: 0,
76
+ counts: { high: 0, medium: 0, low: 0 },
77
+ hits: [],
78
+ elapsedMs: 0,
79
+ timedOut: false,
80
+ };
81
+ // 件数上限: 直近 maxFiles 件だけを対象にし、残りは capped。
82
+ const target = files.slice(0, opts.maxFiles);
83
+ summary.filesSkippedCap = files.length - target.length;
84
+ for (let i = 0; i < target.length; i++) {
85
+ const file = target[i];
86
+ if (now() >= deadline) {
87
+ // 予算超過: 残りのファイル (この枠内) を timeout スキップ扱いにして打ち切る。
88
+ summary.timedOut = true;
89
+ summary.filesSkippedTimeout = target.length - i;
90
+ break;
91
+ }
92
+ if (file.sizeBytes > opts.maxBytesPerFile) {
93
+ summary.filesSkippedSize++;
94
+ opts.onProgress?.(summary.filesScanned + summary.filesSkippedSize, summary.filesTotal);
95
+ continue;
96
+ }
97
+ const timedOut = await scanFile(file, opts, deadline, now, summary);
98
+ summary.filesScanned++;
99
+ opts.onProgress?.(summary.filesScanned + summary.filesSkippedSize, summary.filesTotal);
100
+ if (timedOut) {
101
+ summary.timedOut = true;
102
+ summary.filesSkippedTimeout = target.length - (i + 1);
103
+ break;
104
+ }
105
+ }
106
+ // 重大度降順 → 日時降順。
107
+ summary.hits.sort((a, b) => {
108
+ const s = SEVERITY_RANK[a.maxSeverity] - SEVERITY_RANK[b.maxSeverity];
109
+ if (s !== 0)
110
+ return s;
111
+ return (b.timestamp ?? '').localeCompare(a.timestamp ?? '');
112
+ });
113
+ summary.elapsedMs = now() - start;
114
+ return summary;
115
+ }
116
+ /** 1 ファイルを streaming で読み、検知ヒットを summary に積む。予算超過で true。 */
117
+ async function scanFile(file, opts, deadline, now, summary) {
118
+ const mtimeIso = new Date(file.mtimeMs).toISOString();
119
+ const stream = (0, fs_1.createReadStream)(file.filepath, { encoding: 'utf8' });
120
+ const rl = readline_1.default.createInterface({ input: stream, crlfDelay: Infinity });
121
+ let lineNumber = -1;
122
+ let timedOut = false;
123
+ try {
124
+ for await (const line of rl) {
125
+ lineNumber++;
126
+ if (lineNumber % TIME_CHECK_EVERY_LINES === 0 && now() >= deadline) {
127
+ timedOut = true;
128
+ break;
129
+ }
130
+ const trimmed = line.trim();
131
+ if (trimmed.length === 0)
132
+ continue;
133
+ let raw;
134
+ try {
135
+ raw = JSON.parse(trimmed);
136
+ }
137
+ catch {
138
+ // 破損行 / 書き込み途中行はスキップ。
139
+ continue;
140
+ }
141
+ summary.entriesScanned++;
142
+ const detections = opts.detector.detect((0, secret_detector_1.collectStrings)(raw));
143
+ if (detections.length === 0)
144
+ continue;
145
+ summary.hitEntries++;
146
+ let maxSeverity = 'low';
147
+ for (const d of detections) {
148
+ summary.counts[d.severity] += d.count;
149
+ if (SEVERITY_RANK[d.severity] < SEVERITY_RANK[maxSeverity])
150
+ maxSeverity = d.severity;
151
+ }
152
+ const { sessionId, timestamp, cwd } = extractEntryMeta(raw);
153
+ summary.hits.push({
154
+ filepath: file.filepath,
155
+ source: file.source,
156
+ sessionLabel: buildSessionLabel(file.filepath, sessionId, cwd, opts.masker),
157
+ sessionId,
158
+ timestamp: timestamp ?? mtimeIso,
159
+ lineNumber,
160
+ detections,
161
+ maxSeverity,
162
+ });
163
+ }
164
+ }
165
+ finally {
166
+ rl.close();
167
+ stream.destroy();
168
+ }
169
+ return timedOut;
170
+ }
171
+ /** entry.raw から sessionId / timestamp / cwd を取り出す (local-store.extractMeta と同方針)。 */
172
+ function extractEntryMeta(raw) {
173
+ const r = (raw ?? {});
174
+ const str = (v) => (typeof v === 'string' && v ? v : null);
175
+ return {
176
+ sessionId: str(r.sessionId) ?? str(r.session_id),
177
+ timestamp: str(r.timestamp) ?? str(r.ts),
178
+ cwd: str(r.cwd),
179
+ };
180
+ }
181
+ /**
182
+ * 表示用セッション名を組み立てる (マスク済み)。
183
+ * cwd があればプロジェクト名 (basename をマスク) + 短縮セッションID、
184
+ * 無ければ短縮セッションID (またはファイル名) のみ。生のユーザー名 / 絶対パスは出さない。
185
+ */
186
+ function buildSessionLabel(filepath, sessionId, cwd, masker) {
187
+ const norm = filepath.replace(/\\/g, '/');
188
+ const fileBase = path_1.default.posix.basename(norm).replace(/\.jsonl$/i, '');
189
+ const shortId = (sessionId ?? fileBase).slice(0, 8);
190
+ if (cwd) {
191
+ const proj = path_1.default.posix.basename(cwd.replace(/\\/g, '/').replace(/\/+$/, ''));
192
+ if (proj)
193
+ return `${masker.maskText(proj)} · ${shortId}`;
194
+ }
195
+ return shortId;
196
+ }
197
+ // ---------------------------------------------
198
+ // 軽量 glob (picomatch を持ち込まず、本スキャナの一括列挙に必要な範囲だけ)
199
+ // ---------------------------------------------
200
+ /** glob を正規表現に変換する。`**` はパス区切りを跨ぐ、`*`/`?` は跨がない。 */
201
+ function globToRegExp(glob) {
202
+ const g = glob.replace(/\\/g, '/');
203
+ let re = '^';
204
+ for (let i = 0; i < g.length; i++) {
205
+ const c = g[i];
206
+ if (c === '*') {
207
+ if (g[i + 1] === '*') {
208
+ re += '.*';
209
+ i++;
210
+ // `**/` はディレクトリ 0 段にもマッチさせるため後続の / を吸収する。
211
+ if (g[i + 1] === '/')
212
+ i++;
213
+ }
214
+ else {
215
+ re += '[^/]*';
216
+ }
217
+ }
218
+ else if (c === '?') {
219
+ re += '[^/]';
220
+ }
221
+ else if ('.+^${}()|[]\\'.includes(c)) {
222
+ re += '\\' + c;
223
+ }
224
+ else {
225
+ re += c;
226
+ }
227
+ }
228
+ return new RegExp(re + '$');
229
+ }
230
+ /** glob の先頭の固定 (ワイルドカードを含まない) ディレクトリ部分を返す。 */
231
+ function globBaseDir(glob) {
232
+ const g = glob.replace(/\\/g, '/');
233
+ const segs = g.split('/');
234
+ const baseSegs = [];
235
+ for (const s of segs) {
236
+ if (s.includes('*') || s.includes('?'))
237
+ break;
238
+ baseSegs.push(s);
239
+ }
240
+ // 末尾セグメント (ファイル名 or ワイルドカード) を除く必要はない: ワイルドカードで
241
+ // break するか、固定パスならそのディレクトリを base にしたいので親まで戻す。
242
+ const base = baseSegs.join('/');
243
+ return base || '/';
244
+ }
245
+ /**
246
+ * dir 以下を再帰的に走査してファイルパスを yield する。
247
+ * symlink ディレクトリは辿らない (ループ回避)。深さ上限で暴走を防ぐ。
248
+ */
249
+ async function* walk(dir, depth = 0) {
250
+ if (depth > 32)
251
+ return;
252
+ let entries;
253
+ try {
254
+ entries = await promises_1.default.readdir(dir, { withFileTypes: true });
255
+ }
256
+ catch {
257
+ return;
258
+ }
259
+ for (const e of entries) {
260
+ const full = path_1.default.join(dir, e.name);
261
+ if (e.isSymbolicLink())
262
+ continue;
263
+ if (e.isDirectory()) {
264
+ yield* walk(full, depth + 1);
265
+ }
266
+ else if (e.isFile()) {
267
+ yield full;
268
+ }
269
+ }
270
+ }
271
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/backfill/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDetect(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/cli/detect.ts"],"names":[],"mappings":"AAaA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7D"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runDetect = runDetect;
4
+ const env_detect_1 = require("../env-detect");
5
+ const onboarding_1 = require("../onboarding");
6
+ // =============================================
7
+ // `promptkaizen-agent detect` — 環境オートディテクト (Issue #105 / Epic #102)
8
+ // =============================================
9
+ //
10
+ // Claude Code / Codex の履歴パスと件数を自動検出して表示する。
11
+ // init から内部的にも使われるが、単体でも確認でき、--json で #106 ダッシュボードが消費する。
12
+ //
13
+ // promptkaizen-agent detect # 要約表示
14
+ // promptkaizen-agent detect --json # 機械可読 (ダッシュボード連携)
15
+ async function runDetect(argv) {
16
+ const json = argv.includes('--json');
17
+ await (0, onboarding_1.recordStage)('detect'); // オンボーディング・ファネル (#109)
18
+ const env = await (0, env_detect_1.detectEnvironment)();
19
+ if (json) {
20
+ process.stdout.write(JSON.stringify(env) + '\n');
21
+ return;
22
+ }
23
+ console.log('PromptKaizen — 環境オートディテクト');
24
+ console.log('');
25
+ console.log('検出された環境:');
26
+ for (const line of (0, env_detect_1.formatDetectionSummary)(env))
27
+ console.log(line);
28
+ console.log('');
29
+ if (env.anyDetected) {
30
+ console.log(`✅ 解析対象が確定しました(${env.detected.map((t) => t.label).join(' + ')})`);
31
+ console.log('watchPaths:');
32
+ for (const p of env.watchPaths)
33
+ console.log(` ${p}`);
34
+ }
35
+ else {
36
+ console.log('⚠️ Claude Code / Codex の履歴が見つかりませんでした。');
37
+ console.log(' カスタムパスを使う場合は init で手入力できます: promptkaizen-agent init');
38
+ }
39
+ }
40
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/cli/detect.ts"],"names":[],"mappings":";;AAaA,8BAuBC;AApCD,8CAAyE;AACzE,8CAA2C;AAE3C,gDAAgD;AAChD,oEAAoE;AACpE,gDAAgD;AAChD,EAAE;AACF,2CAA2C;AAC3C,yDAAyD;AACzD,EAAE;AACF,8CAA8C;AAC9C,0DAA0D;AAEnD,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpC,MAAM,IAAA,wBAAW,EAAC,QAAQ,CAAC,CAAA,CAAC,uBAAuB;IACnD,MAAM,GAAG,GAAG,MAAM,IAAA,8BAAiB,GAAE,CAAA;IAErC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;QAChD,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACvB,KAAK,MAAM,IAAI,IAAI,IAAA,mCAAsB,EAAC,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7E,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAC1B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runDisable(_argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=disable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../src/cli/disable.ts"],"names":[],"mappings":"AAcA,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B/D"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runDisable = runDisable;
4
+ const install_hooks_1 = require("./install-hooks");
5
+ const uninstall_launchd_1 = require("./uninstall-launchd");
6
+ const uninstall_systemd_1 = require("./uninstall-systemd");
7
+ const uninstall_task_1 = require("./uninstall-task");
8
+ // =============================================
9
+ // `promptkaizen-agent disable` — 常駐化の解除 (Issue #108 / Epic #102)
10
+ // =============================================
11
+ //
12
+ // `enable` の対になる無効化。hooks (Claude Code / Codex) を解除し、常駐デーモン
13
+ // (launchd / systemd / Task Scheduler) を OS に応じて解除する。
14
+ // 設定 (~/.promptkaizen/agent.config.json) とオフセットは保持する。
15
+ // いずれの解除も冪等 (未登録なら no-op)。
16
+ async function runDisable(_argv) {
17
+ console.log('常駐監視を無効化しています…\n');
18
+ // 1. hooks 解除 (両プラットフォーム。未登録なら no-op)。
19
+ for (const p of ['claude-code', 'codex']) {
20
+ try {
21
+ await (0, install_hooks_1.runUninstallHooks)(['--platform', p]);
22
+ }
23
+ catch (e) {
24
+ console.error(`hooks 解除に失敗 (${p}): ${e.message}`);
25
+ }
26
+ }
27
+ // 2. 常駐デーモン解除 (OS 別)。
28
+ console.log('');
29
+ if (process.platform === 'darwin') {
30
+ await (0, uninstall_launchd_1.runUninstallLaunchd)([]);
31
+ }
32
+ else if (process.platform === 'linux') {
33
+ await (0, uninstall_systemd_1.runUninstallSystemd)([]);
34
+ }
35
+ else if (process.platform === 'win32') {
36
+ await (0, uninstall_task_1.runUninstallTask)([]);
37
+ }
38
+ else {
39
+ console.log('(この環境の常駐デーモンは手動で停止してください: 起動した `start` を kill)');
40
+ }
41
+ console.log('\n✅ 常駐監視を無効化しました。設定・オフセットは保持されています。');
42
+ console.log(' 再度有効化: promptkaizen-agent enable');
43
+ }
44
+ //# sourceMappingURL=disable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.js","sourceRoot":"","sources":["../../src/cli/disable.ts"],"names":[],"mappings":";;AAcA,gCA0BC;AAxCD,mDAAmD;AACnD,2DAAyD;AACzD,2DAAyD;AACzD,qDAAmD;AAEnD,gDAAgD;AAChD,iEAAiE;AACjE,gDAAgD;AAChD,EAAE;AACF,4DAA4D;AAC5D,sDAAsD;AACtD,sDAAsD;AACtD,2BAA2B;AAEpB,KAAK,UAAU,UAAU,CAAC,KAAe;IAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAE/B,uCAAuC;IACvC,KAAK,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAU,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAA,iCAAiB,EAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAO,CAAW,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAA,uCAAmB,EAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,IAAA,uCAAmB,EAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,IAAA,iCAAgB,EAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runEnable(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=enable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../src/cli/enable.ts"],"names":[],"mappings":"AAiCA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD7D"}