@hopping-dev/hub 0.1.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.
Files changed (165) hide show
  1. package/assets/hopping-skill/SKILL.md +221 -0
  2. package/dist/approval/manager.d.ts +60 -0
  3. package/dist/approval/manager.d.ts.map +1 -0
  4. package/dist/approval/manager.js +101 -0
  5. package/dist/approval/manager.js.map +1 -0
  6. package/dist/approval/session-memory.d.ts +37 -0
  7. package/dist/approval/session-memory.d.ts.map +1 -0
  8. package/dist/approval/session-memory.js +63 -0
  9. package/dist/approval/session-memory.js.map +1 -0
  10. package/dist/cli/config-writer.d.ts +57 -0
  11. package/dist/cli/config-writer.d.ts.map +1 -0
  12. package/dist/cli/config-writer.js +318 -0
  13. package/dist/cli/config-writer.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +82 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/cli/path-resolver.d.ts +48 -0
  19. package/dist/cli/path-resolver.d.ts.map +1 -0
  20. package/dist/cli/path-resolver.js +212 -0
  21. package/dist/cli/path-resolver.js.map +1 -0
  22. package/dist/cli/setup.d.ts +10 -0
  23. package/dist/cli/setup.d.ts.map +1 -0
  24. package/dist/cli/setup.js +268 -0
  25. package/dist/cli/setup.js.map +1 -0
  26. package/dist/cloud/connector.d.ts +74 -0
  27. package/dist/cloud/connector.d.ts.map +1 -0
  28. package/dist/cloud/connector.js +524 -0
  29. package/dist/cloud/connector.js.map +1 -0
  30. package/dist/cloud/index.d.ts +3 -0
  31. package/dist/cloud/index.d.ts.map +1 -0
  32. package/dist/cloud/index.js +6 -0
  33. package/dist/cloud/index.js.map +1 -0
  34. package/dist/config/manager.d.ts +76 -0
  35. package/dist/config/manager.d.ts.map +1 -0
  36. package/dist/config/manager.js +296 -0
  37. package/dist/config/manager.js.map +1 -0
  38. package/dist/dev-mode.d.ts +30 -0
  39. package/dist/dev-mode.d.ts.map +1 -0
  40. package/dist/dev-mode.js +53 -0
  41. package/dist/dev-mode.js.map +1 -0
  42. package/dist/index.d.ts +10 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +354 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/ipc/index.d.ts +12 -0
  47. package/dist/ipc/index.d.ts.map +1 -0
  48. package/dist/ipc/index.js +15 -0
  49. package/dist/ipc/index.js.map +1 -0
  50. package/dist/ipc/watcher.d.ts +226 -0
  51. package/dist/ipc/watcher.d.ts.map +1 -0
  52. package/dist/ipc/watcher.js +745 -0
  53. package/dist/ipc/watcher.js.map +1 -0
  54. package/dist/local/approval-dialog.d.ts +30 -0
  55. package/dist/local/approval-dialog.d.ts.map +1 -0
  56. package/dist/local/approval-dialog.js +214 -0
  57. package/dist/local/approval-dialog.js.map +1 -0
  58. package/dist/local/index.d.ts +8 -0
  59. package/dist/local/index.d.ts.map +1 -0
  60. package/dist/local/index.js +13 -0
  61. package/dist/local/index.js.map +1 -0
  62. package/dist/local/local-approval.d.ts +55 -0
  63. package/dist/local/local-approval.d.ts.map +1 -0
  64. package/dist/local/local-approval.js +125 -0
  65. package/dist/local/local-approval.js.map +1 -0
  66. package/dist/local/notifier.d.ts +19 -0
  67. package/dist/local/notifier.d.ts.map +1 -0
  68. package/dist/local/notifier.js +110 -0
  69. package/dist/local/notifier.js.map +1 -0
  70. package/dist/local/sanitize.d.ts +20 -0
  71. package/dist/local/sanitize.d.ts.map +1 -0
  72. package/dist/local/sanitize.js +28 -0
  73. package/dist/local/sanitize.js.map +1 -0
  74. package/dist/mcp/file-extractor.d.ts +11 -0
  75. package/dist/mcp/file-extractor.d.ts.map +1 -0
  76. package/dist/mcp/file-extractor.js +74 -0
  77. package/dist/mcp/file-extractor.js.map +1 -0
  78. package/dist/mcp/risk-level.d.ts +44 -0
  79. package/dist/mcp/risk-level.d.ts.map +1 -0
  80. package/dist/mcp/risk-level.js +127 -0
  81. package/dist/mcp/risk-level.js.map +1 -0
  82. package/dist/mcp/schemas.d.ts +83 -0
  83. package/dist/mcp/schemas.d.ts.map +1 -0
  84. package/dist/mcp/schemas.js +84 -0
  85. package/dist/mcp/schemas.js.map +1 -0
  86. package/dist/mcp/summary.d.ts +11 -0
  87. package/dist/mcp/summary.d.ts.map +1 -0
  88. package/dist/mcp/summary.js +150 -0
  89. package/dist/mcp/summary.js.map +1 -0
  90. package/dist/mcp/tools.d.ts +45 -0
  91. package/dist/mcp/tools.d.ts.map +1 -0
  92. package/dist/mcp/tools.js +1217 -0
  93. package/dist/mcp/tools.js.map +1 -0
  94. package/dist/pairing/auto-pairing.d.ts +37 -0
  95. package/dist/pairing/auto-pairing.d.ts.map +1 -0
  96. package/dist/pairing/auto-pairing.js +144 -0
  97. package/dist/pairing/auto-pairing.js.map +1 -0
  98. package/dist/pairing/binding-poller.d.ts +26 -0
  99. package/dist/pairing/binding-poller.d.ts.map +1 -0
  100. package/dist/pairing/binding-poller.js +108 -0
  101. package/dist/pairing/binding-poller.js.map +1 -0
  102. package/dist/pairing/pairing-server.d.ts +14 -0
  103. package/dist/pairing/pairing-server.d.ts.map +1 -0
  104. package/dist/pairing/pairing-server.js +277 -0
  105. package/dist/pairing/pairing-server.js.map +1 -0
  106. package/dist/pairing/qr-display.d.ts +14 -0
  107. package/dist/pairing/qr-display.d.ts.map +1 -0
  108. package/dist/pairing/qr-display.js +40 -0
  109. package/dist/pairing/qr-display.js.map +1 -0
  110. package/dist/policy/engine.d.ts +31 -0
  111. package/dist/policy/engine.d.ts.map +1 -0
  112. package/dist/policy/engine.js +187 -0
  113. package/dist/policy/engine.js.map +1 -0
  114. package/dist/policy/store.d.ts +26 -0
  115. package/dist/policy/store.d.ts.map +1 -0
  116. package/dist/policy/store.js +70 -0
  117. package/dist/policy/store.js.map +1 -0
  118. package/dist/policy/system-policies.d.ts +15 -0
  119. package/dist/policy/system-policies.d.ts.map +1 -0
  120. package/dist/policy/system-policies.js +265 -0
  121. package/dist/policy/system-policies.js.map +1 -0
  122. package/dist/policy/tool-mapping.d.ts +45 -0
  123. package/dist/policy/tool-mapping.d.ts.map +1 -0
  124. package/dist/policy/tool-mapping.js +88 -0
  125. package/dist/policy/tool-mapping.js.map +1 -0
  126. package/dist/policy/tool-registry.json +85 -0
  127. package/dist/store/db.d.ts +17 -0
  128. package/dist/store/db.d.ts.map +1 -0
  129. package/dist/store/db.js +193 -0
  130. package/dist/store/db.js.map +1 -0
  131. package/dist/store/index.d.ts +4 -0
  132. package/dist/store/index.d.ts.map +1 -0
  133. package/dist/store/index.js +7 -0
  134. package/dist/store/index.js.map +1 -0
  135. package/dist/store/metadata.d.ts +31 -0
  136. package/dist/store/metadata.d.ts.map +1 -0
  137. package/dist/store/metadata.js +178 -0
  138. package/dist/store/metadata.js.map +1 -0
  139. package/dist/store/operations.d.ts +26 -0
  140. package/dist/store/operations.d.ts.map +1 -0
  141. package/dist/store/operations.js +171 -0
  142. package/dist/store/operations.js.map +1 -0
  143. package/dist/utils/json.d.ts +7 -0
  144. package/dist/utils/json.d.ts.map +1 -0
  145. package/dist/utils/json.js +33 -0
  146. package/dist/utils/json.js.map +1 -0
  147. package/dist/utils/logger.d.ts +13 -0
  148. package/dist/utils/logger.d.ts.map +1 -0
  149. package/dist/utils/logger.js +58 -0
  150. package/dist/utils/logger.js.map +1 -0
  151. package/dist/utils/open-browser.d.ts +8 -0
  152. package/dist/utils/open-browser.d.ts.map +1 -0
  153. package/dist/utils/open-browser.js +38 -0
  154. package/dist/utils/open-browser.js.map +1 -0
  155. package/node_modules/@hopping/shared/dist/types.d.ts +649 -0
  156. package/node_modules/@hopping/shared/dist/types.js +48 -0
  157. package/node_modules/@hopping/shared/dist/types.js.map +1 -0
  158. package/node_modules/@hopping/shared/package.json +14 -0
  159. package/node_modules/@hopping/shared/tsconfig.json +16 -0
  160. package/node_modules/@hopping/shared/types.d.ts +650 -0
  161. package/node_modules/@hopping/shared/types.d.ts.map +1 -0
  162. package/node_modules/@hopping/shared/types.js +48 -0
  163. package/node_modules/@hopping/shared/types.js.map +1 -0
  164. package/node_modules/@hopping/shared/types.ts +895 -0
  165. package/package.json +52 -0
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ConfigManager = exports.DEFAULT_ASK_CONFIG = exports.DEFAULT_LOCAL_APPROVAL_CONFIG = exports.DEFAULT_APPROVAL_CONFIG = exports.DEFAULT_CONFIG_FILE = exports.DEFAULT_CONFIG_DIR = void 0;
37
+ exports.toApprovalDecision = toApprovalDecision;
38
+ const fs = __importStar(require("node:fs/promises"));
39
+ const os = __importStar(require("node:os"));
40
+ const path = __importStar(require("node:path"));
41
+ // ============================================
42
+ // 預設路徑常數
43
+ // ============================================
44
+ exports.DEFAULT_CONFIG_DIR = path.join(os.homedir(), '.hopping');
45
+ exports.DEFAULT_CONFIG_FILE = path.join(exports.DEFAULT_CONFIG_DIR, 'config.json');
46
+ /** TimeoutAction → TimeoutDecision 轉換(送往 Cloud 前使用) */
47
+ function toApprovalDecision(action) {
48
+ const map = {
49
+ ask_agent: 'timeout',
50
+ keep_open: 'pending',
51
+ auto_approve: 'approved',
52
+ auto_deny: 'denied',
53
+ };
54
+ return map[action];
55
+ }
56
+ exports.DEFAULT_APPROVAL_CONFIG = {
57
+ timeouts: { low: 30000, medium: 60000, high: 30000, critical: 30000 },
58
+ onTimeout: { low: 'ask_agent', medium: 'ask_agent', high: 'keep_open', critical: 'keep_open' },
59
+ };
60
+ /** Upper bound for timeout values (4 hours) */
61
+ const MAX_TIMEOUT_MS = 4 * 60 * 60 * 1000; // 14_400_000
62
+ // ============================================
63
+ // LocalApproval Configuration (S3-HUB-LOCAL-001)
64
+ // ============================================
65
+ exports.DEFAULT_LOCAL_APPROVAL_CONFIG = {
66
+ enabled: true,
67
+ dialogEnabled: true,
68
+ soundEnabled: true,
69
+ raceMode: true,
70
+ };
71
+ // ============================================
72
+ // Ask Config (S4-HUB-RPERM-001)
73
+ // ============================================
74
+ exports.DEFAULT_ASK_CONFIG = {
75
+ timeoutEnabled: true,
76
+ timeoutMs: 3_600_000, // 1 hour
77
+ };
78
+ // ============================================
79
+ // ConfigManager
80
+ // ============================================
81
+ /**
82
+ * ConfigManager — Hub 本地設定持久化
83
+ *
84
+ * 負責:
85
+ * 1. 讀取 ~/.hopping/config.json(配對後取得的 agentId + token)
86
+ * 2. 配對成功後寫入設定檔(chmod 0o600)
87
+ * 3. 提供 token 讀取(token 優先順序由呼叫者決定:env > getToken() > 無)
88
+ */
89
+ class ConfigManager {
90
+ configPath;
91
+ constructor(configPath = exports.DEFAULT_CONFIG_FILE) {
92
+ this.configPath = configPath;
93
+ }
94
+ /**
95
+ * 讀取完整設定
96
+ * - 找不到檔案或解析失敗時回傳 null(不 throw)
97
+ */
98
+ async getConfig() {
99
+ try {
100
+ const content = await fs.readFile(this.configPath, 'utf-8');
101
+ return JSON.parse(content);
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ /**
108
+ * 取得 token
109
+ * - 找不到設定或 token 為空時回傳 null
110
+ */
111
+ async getToken() {
112
+ const config = await this.getConfig();
113
+ return config?.token ?? null;
114
+ }
115
+ /**
116
+ * 配對成功後儲存設定
117
+ * - 建立 ~/.hopping/ 目錄(若不存在)
118
+ * - 寫入 config.json,權限設為 0o600
119
+ */
120
+ async saveAfterPairing(agentId, token, cloudUrl) {
121
+ const config = {
122
+ agentId,
123
+ token,
124
+ cloudUrl,
125
+ pairedAt: new Date().toISOString(),
126
+ };
127
+ const dir = path.dirname(this.configPath);
128
+ await fs.mkdir(dir, { recursive: true });
129
+ await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), {
130
+ encoding: 'utf-8',
131
+ mode: 0o600,
132
+ });
133
+ }
134
+ /**
135
+ * 取得 toolMappings 設定(User Config Layer 1)
136
+ *
137
+ * 讀取 ~/.hopping/config.json 的 toolMappings section。
138
+ * 不存在或解析失敗時回傳 null(不 throw)。
139
+ */
140
+ async getToolMappings() {
141
+ try {
142
+ const content = await fs.readFile(this.configPath, 'utf-8');
143
+ const parsed = JSON.parse(content);
144
+ const toolMappings = parsed['toolMappings'];
145
+ if (!toolMappings || typeof toolMappings !== 'object') {
146
+ return null;
147
+ }
148
+ // 基本結構檢查:必須有 agents 物件
149
+ const tm = toolMappings;
150
+ if (!tm['agents'] || typeof tm['agents'] !== 'object') {
151
+ return null;
152
+ }
153
+ return toolMappings;
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * 取得 localApproval 設定(REQ-HUB-035)
161
+ *
162
+ * 讀取 ~/.hopping/config.json 的 localApproval section,支援 partial override。
163
+ * 找不到設定或解析失敗時回傳預設值(不 throw)。
164
+ */
165
+ async getLocalApprovalConfig() {
166
+ try {
167
+ const content = await fs.readFile(this.configPath, 'utf-8');
168
+ const parsed = JSON.parse(content);
169
+ const localApproval = parsed['localApproval'];
170
+ if (!localApproval || typeof localApproval !== 'object') {
171
+ return { ...exports.DEFAULT_LOCAL_APPROVAL_CONFIG };
172
+ }
173
+ const la = localApproval;
174
+ return {
175
+ enabled: typeof la['enabled'] === 'boolean'
176
+ ? la['enabled']
177
+ : exports.DEFAULT_LOCAL_APPROVAL_CONFIG.enabled,
178
+ dialogEnabled: typeof la['dialogEnabled'] === 'boolean'
179
+ ? la['dialogEnabled']
180
+ : exports.DEFAULT_LOCAL_APPROVAL_CONFIG.dialogEnabled,
181
+ soundEnabled: typeof la['soundEnabled'] === 'boolean'
182
+ ? la['soundEnabled']
183
+ : exports.DEFAULT_LOCAL_APPROVAL_CONFIG.soundEnabled,
184
+ raceMode: typeof la['raceMode'] === 'boolean'
185
+ ? la['raceMode']
186
+ : exports.DEFAULT_LOCAL_APPROVAL_CONFIG.raceMode,
187
+ };
188
+ }
189
+ catch {
190
+ return { ...exports.DEFAULT_LOCAL_APPROVAL_CONFIG };
191
+ }
192
+ }
193
+ /**
194
+ * 清除本地設定(用於取消配對)
195
+ * - 找不到檔案時不 throw
196
+ */
197
+ async clear() {
198
+ try {
199
+ await fs.unlink(this.configPath);
200
+ }
201
+ catch (err) {
202
+ // ENOENT = 檔案不存在,視為成功
203
+ if (err.code !== 'ENOENT') {
204
+ throw err;
205
+ }
206
+ }
207
+ }
208
+ /**
209
+ * 取得 askConfig 設定(REQ-HUB-042)
210
+ *
211
+ * 讀取 ~/.hopping/config.json 的 askConfig section,支援 partial override。
212
+ * 找不到設定或解析失敗時回傳預設值(timeoutEnabled: true, timeoutMs: 1hr)。
213
+ */
214
+ async getAskConfig() {
215
+ try {
216
+ const content = await fs.readFile(this.configPath, 'utf-8');
217
+ const parsed = JSON.parse(content);
218
+ const askConfig = parsed['askConfig'];
219
+ if (!askConfig || typeof askConfig !== 'object') {
220
+ return { ...exports.DEFAULT_ASK_CONFIG };
221
+ }
222
+ const ac = askConfig;
223
+ return {
224
+ timeoutEnabled: typeof ac['timeoutEnabled'] === 'boolean'
225
+ ? ac['timeoutEnabled']
226
+ : exports.DEFAULT_ASK_CONFIG.timeoutEnabled,
227
+ timeoutMs: typeof ac['timeoutMs'] === 'number' && ac['timeoutMs'] > 0
228
+ ? ac['timeoutMs']
229
+ : exports.DEFAULT_ASK_CONFIG.timeoutMs,
230
+ };
231
+ }
232
+ catch {
233
+ return { ...exports.DEFAULT_ASK_CONFIG };
234
+ }
235
+ }
236
+ /**
237
+ * 取得 Approval timeout 設定
238
+ *
239
+ * 優先序:HOPPING_APPROVAL_TIMEOUT_MS env > config.json approval section > defaults
240
+ */
241
+ async getApprovalConfig() {
242
+ // 1. env var overrides all timeouts
243
+ const envTimeout = process.env['HOPPING_APPROVAL_TIMEOUT_MS'];
244
+ if (envTimeout) {
245
+ const ms = parseInt(envTimeout, 10);
246
+ if (!isNaN(ms) && ms > 0 && ms <= MAX_TIMEOUT_MS) {
247
+ return {
248
+ timeouts: { low: ms, medium: ms, high: ms, critical: ms },
249
+ onTimeout: { ...exports.DEFAULT_APPROVAL_CONFIG.onTimeout },
250
+ };
251
+ }
252
+ }
253
+ // 2. config.json approval section
254
+ let fileConfig = null;
255
+ try {
256
+ const content = await fs.readFile(this.configPath, 'utf-8');
257
+ fileConfig = JSON.parse(content);
258
+ }
259
+ catch {
260
+ // file not found or invalid JSON → use defaults
261
+ }
262
+ if (!fileConfig ||
263
+ typeof fileConfig['approval'] !== 'object' ||
264
+ fileConfig['approval'] === null) {
265
+ return { ...exports.DEFAULT_APPROVAL_CONFIG };
266
+ }
267
+ const approval = fileConfig['approval'];
268
+ const result = {
269
+ timeouts: { ...exports.DEFAULT_APPROVAL_CONFIG.timeouts },
270
+ onTimeout: { ...exports.DEFAULT_APPROVAL_CONFIG.onTimeout },
271
+ };
272
+ // merge timeouts
273
+ if (typeof approval['timeouts'] === 'object' && approval['timeouts'] !== null) {
274
+ const t = approval['timeouts'];
275
+ for (const key of ['low', 'medium', 'high', 'critical']) {
276
+ const val = t[key];
277
+ if (typeof val === 'number' && val > 0 && val <= MAX_TIMEOUT_MS) {
278
+ result.timeouts[key] = val;
279
+ }
280
+ }
281
+ }
282
+ // merge onTimeout
283
+ if (typeof approval['onTimeout'] === 'object' && approval['onTimeout'] !== null) {
284
+ const ot = approval['onTimeout'];
285
+ const validActions = ['ask_agent', 'keep_open', 'auto_approve', 'auto_deny'];
286
+ for (const key of ['low', 'medium', 'high', 'critical']) {
287
+ if (typeof ot[key] === 'string' && validActions.includes(ot[key])) {
288
+ result.onTimeout[key] = ot[key];
289
+ }
290
+ }
291
+ }
292
+ return result;
293
+ }
294
+ }
295
+ exports.ConfigManager = ConfigManager;
296
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { DevMode } from '@hopping/shared';
2
+ /**
3
+ * 開發模式控制(雞生蛋解法)
4
+ *
5
+ * 解決「用 Claude Code 開發攔截 Claude Code 的工具」的問題
6
+ *
7
+ * - isolated: 完全不攔截(預設,開發時用)
8
+ * - allowlist: 只攔截指定工具(Hub 開發時用)
9
+ * - full: 完整攔截(整合測試時用)
10
+ * - yolo: 觀測模式 — Policy Engine 仍執行(取得 riskLevel),但全部 auto-approve + 完整記錄
11
+ */
12
+ export declare const DEV_MODE: DevMode;
13
+ /**
14
+ * 判斷是否應該攔截該工具
15
+ * yolo 模式回傳 true:確保 Policy Engine 仍執行(取得 riskLevel 用於觀測),
16
+ * 但後續 handleCheck / handlePendingFile 會走 YOLO auto-approve 路徑,而非送審。
17
+ */
18
+ export declare function shouldIntercept(toolName: string): boolean;
19
+ /**
20
+ * 是否為 YOLO 觀測模式
21
+ */
22
+ export declare function isYoloMode(): boolean;
23
+ /**
24
+ * 取得目前開發模式資訊
25
+ */
26
+ export declare function getDevModeInfo(): {
27
+ mode: DevMode;
28
+ allowlist: string[];
29
+ };
30
+ //# sourceMappingURL=dev-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-mode.d.ts","sourceRoot":"","sources":["../src/dev-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAiE,CAAC;AAIzF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAKvE"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEV_MODE = void 0;
4
+ exports.shouldIntercept = shouldIntercept;
5
+ exports.isYoloMode = isYoloMode;
6
+ exports.getDevModeInfo = getDevModeInfo;
7
+ /**
8
+ * 開發模式控制(雞生蛋解法)
9
+ *
10
+ * 解決「用 Claude Code 開發攔截 Claude Code 的工具」的問題
11
+ *
12
+ * - isolated: 完全不攔截(預設,開發時用)
13
+ * - allowlist: 只攔截指定工具(Hub 開發時用)
14
+ * - full: 完整攔截(整合測試時用)
15
+ * - yolo: 觀測模式 — Policy Engine 仍執行(取得 riskLevel),但全部 auto-approve + 完整記錄
16
+ */
17
+ exports.DEV_MODE = (process.env.HOPPING_DEV_MODE || 'isolated');
18
+ const ALLOWLIST = (process.env.HOPPING_ALLOWLIST || '').split(',').filter(Boolean);
19
+ /**
20
+ * 判斷是否應該攔截該工具
21
+ * yolo 模式回傳 true:確保 Policy Engine 仍執行(取得 riskLevel 用於觀測),
22
+ * 但後續 handleCheck / handlePendingFile 會走 YOLO auto-approve 路徑,而非送審。
23
+ */
24
+ function shouldIntercept(toolName) {
25
+ switch (exports.DEV_MODE) {
26
+ case 'isolated':
27
+ return false;
28
+ case 'full':
29
+ return true;
30
+ case 'yolo':
31
+ return true;
32
+ case 'allowlist':
33
+ return ALLOWLIST.includes(toolName);
34
+ default:
35
+ return false;
36
+ }
37
+ }
38
+ /**
39
+ * 是否為 YOLO 觀測模式
40
+ */
41
+ function isYoloMode() {
42
+ return exports.DEV_MODE === 'yolo';
43
+ }
44
+ /**
45
+ * 取得目前開發模式資訊
46
+ */
47
+ function getDevModeInfo() {
48
+ return {
49
+ mode: exports.DEV_MODE,
50
+ allowlist: ALLOWLIST,
51
+ };
52
+ }
53
+ //# sourceMappingURL=dev-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-mode.js","sourceRoot":"","sources":["../src/dev-mode.ts"],"names":[],"mappings":";;;AAqBA,0CAaC;AAKD,gCAEC;AAKD,wCAKC;AAjDD;;;;;;;;;GASG;AACU,QAAA,QAAQ,GAAY,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU,CAAY,CAAC;AAEzF,MAAM,SAAS,GAAa,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAE7F;;;;GAIG;AACH,SAAgB,eAAe,CAAC,QAAgB;IAC9C,QAAQ,gBAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,WAAW;YACd,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,OAAO,gBAAQ,KAAK,MAAM,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO;QACL,IAAI,EAAE,gBAAQ;QACd,SAAS,EAAE,SAAS;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Logger } from './utils/logger';
2
+ import { PolicyStore } from './policy/store';
3
+ import { PolicyEngine } from './policy/engine';
4
+ import { ApprovalManager } from './approval/manager';
5
+ declare const logger: Logger;
6
+ declare const policyStore: PolicyStore;
7
+ declare const policyEngine: PolicyEngine;
8
+ declare const approvalManager: ApprovalManager;
9
+ export { logger, policyStore, policyEngine, approvalManager };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAiBrD,QAAA,MAAM,MAAM,QAAoC,CAAC;AAIjD,QAAA,MAAM,WAAW,aAA0B,CAAC;AAC5C,QAAA,MAAM,YAAY,cAAwC,CAAC;AAC3D,QAAA,MAAM,eAAe,iBAA8B,CAAC;AA0TpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC"}