@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,318 @@
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.writeMcpJson = writeMcpJson;
37
+ exports.writeMcpToml = writeMcpToml;
38
+ exports.writeMcpConfig = writeMcpConfig;
39
+ exports.writeClaudeCodeHooks = writeClaudeCodeHooks;
40
+ exports.isCursorAdapterReady = isCursorAdapterReady;
41
+ exports.writeCursorHooks = writeCursorHooks;
42
+ exports.writeHooksConfig = writeHooksConfig;
43
+ /**
44
+ * ConfigWriter — 設定檔讀取/合併/寫入(JSON + TOML)
45
+ *
46
+ * REQ-HUB-042: Setup CLI — Multi-Agent Config File Merge
47
+ * REQ-HUB-043: Setup CLI — Cross-Platform Hook Commands
48
+ */
49
+ const fs = __importStar(require("node:fs/promises"));
50
+ const path = __importStar(require("node:path"));
51
+ const node_fs_1 = require("node:fs");
52
+ const TOML = __importStar(require("smol-toml"));
53
+ const path_resolver_1 = require("./path-resolver");
54
+ // ============================================
55
+ // Helpers
56
+ // ============================================
57
+ /**
58
+ * 確保目錄存在
59
+ */
60
+ async function ensureDir(filePath) {
61
+ const dir = path.dirname(filePath);
62
+ await fs.mkdir(dir, { recursive: true });
63
+ }
64
+ /**
65
+ * 讀取 JSON 檔案,不存在返回空物件
66
+ */
67
+ async function readJsonFile(filePath) {
68
+ try {
69
+ const content = await fs.readFile(filePath, 'utf-8');
70
+ return JSON.parse(content);
71
+ }
72
+ catch (err) {
73
+ if (err.code !== 'ENOENT') {
74
+ console.error(` ⚠ Warning: Failed to parse ${filePath}, will create new config`);
75
+ }
76
+ return {};
77
+ }
78
+ }
79
+ /**
80
+ * 讀取 TOML 檔案,不存在返回空物件
81
+ */
82
+ async function readTomlFile(filePath) {
83
+ try {
84
+ const content = await fs.readFile(filePath, 'utf-8');
85
+ return TOML.parse(content);
86
+ }
87
+ catch (err) {
88
+ if (err.code !== 'ENOENT') {
89
+ console.error(` ⚠ Warning: Failed to parse ${filePath}, will create new config`);
90
+ }
91
+ return {};
92
+ }
93
+ }
94
+ /**
95
+ * 建立 .bak 備份(僅當檔案已存在時)
96
+ */
97
+ async function createBackup(filePath) {
98
+ if ((0, node_fs_1.existsSync)(filePath)) {
99
+ await fs.copyFile(filePath, `${filePath}.bak`);
100
+ return true;
101
+ }
102
+ return false;
103
+ }
104
+ /**
105
+ * 寫入 JSON 檔案(含備份 + 目錄建立)
106
+ */
107
+ async function writeJsonFile(filePath, data, dryRun) {
108
+ const existed = (0, node_fs_1.existsSync)(filePath);
109
+ let backedUp = false;
110
+ if (!dryRun) {
111
+ await ensureDir(filePath);
112
+ backedUp = await createBackup(filePath);
113
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
114
+ }
115
+ return {
116
+ path: filePath,
117
+ action: existed ? 'updated' : 'created',
118
+ backedUp,
119
+ };
120
+ }
121
+ /**
122
+ * 寫入 TOML 檔案(含備份 + 目錄建立)
123
+ */
124
+ async function writeTomlFile(filePath, data, dryRun) {
125
+ const existed = (0, node_fs_1.existsSync)(filePath);
126
+ let backedUp = false;
127
+ if (!dryRun) {
128
+ await ensureDir(filePath);
129
+ backedUp = await createBackup(filePath);
130
+ await fs.writeFile(filePath, TOML.stringify(data) + '\n', 'utf-8');
131
+ }
132
+ return {
133
+ path: filePath,
134
+ action: existed ? 'updated' : 'created',
135
+ backedUp,
136
+ };
137
+ }
138
+ // ============================================
139
+ // MCP Config Writers (REQ-HUB-042)
140
+ // ============================================
141
+ /**
142
+ * 建立 MCP Server 設定物件
143
+ */
144
+ function buildMcpEntry(agent, options) {
145
+ const entry = {
146
+ command: options.hubCommand,
147
+ args: [...options.hubArgs],
148
+ env: { HOPPING_DEV_MODE: options.devMode },
149
+ };
150
+ // Claude Code 需要 type: 'stdio'
151
+ if (agent.name === 'claude-code') {
152
+ entry.type = 'stdio';
153
+ }
154
+ return entry;
155
+ }
156
+ /**
157
+ * 寫入 Claude Code / Cursor MCP config(JSON 格式)
158
+ * - Claude Code: .mcp.json(project) / ~/.claude.json(user)
159
+ * - Cursor: .cursor/mcp.json(project) / ~/.cursor/mcp.json(user)
160
+ */
161
+ async function writeMcpJson(agent, options) {
162
+ const configPath = options.scope === 'project' ? agent.mcpConfigPath : agent.globalMcpConfigPath;
163
+ const existing = await readJsonFile(configPath);
164
+ const mcpServers = (existing.mcpServers ?? {});
165
+ mcpServers['hopping-hub'] = buildMcpEntry(agent, options);
166
+ existing.mcpServers = mcpServers;
167
+ return writeJsonFile(configPath, existing, options.dryRun);
168
+ }
169
+ /**
170
+ * 寫入 Codex MCP config(TOML 格式)
171
+ * - .codex/config.toml(project / user)
172
+ */
173
+ async function writeMcpToml(agent, options) {
174
+ const configPath = options.scope === 'project' ? agent.mcpConfigPath : agent.globalMcpConfigPath;
175
+ const existing = await readTomlFile(configPath);
176
+ const mcpServers = (existing.mcp_servers ?? {});
177
+ mcpServers['hopping-hub'] = {
178
+ command: options.hubCommand,
179
+ args: [...options.hubArgs],
180
+ enabled: true,
181
+ env: { HOPPING_DEV_MODE: options.devMode },
182
+ };
183
+ existing.mcp_servers = mcpServers;
184
+ return writeTomlFile(configPath, existing, options.dryRun);
185
+ }
186
+ /**
187
+ * 寫入 MCP config(根據 agent 自動分派 JSON 或 TOML)
188
+ */
189
+ async function writeMcpConfig(agent, options) {
190
+ if (agent.configFormat === 'toml') {
191
+ return writeMcpToml(agent, options);
192
+ }
193
+ return writeMcpJson(agent, options);
194
+ }
195
+ // ============================================
196
+ // Hooks Config Writers (REQ-HUB-042)
197
+ // ============================================
198
+ /** Hook command pattern(用於偵測既有 hopping hooks) */
199
+ const HOPPING_HOOK_PATTERN = /hopping|pre-tool-use|post-tool-use|cursor-adapter/i;
200
+ /**
201
+ * 寫入 Claude Code Hooks config(.claude/settings.json,巢狀格式,PascalCase)
202
+ */
203
+ async function writeClaudeCodeHooks(hooksConfigPath, options) {
204
+ const existing = await readJsonFile(hooksConfigPath);
205
+ const hooks = (existing.hooks ?? {});
206
+ const preCommand = (0, path_resolver_1.buildPreHookCommand)(options.preHookPath, options.devMode);
207
+ const postCommand = (0, path_resolver_1.buildPostHookCommand)(options.postHookPath);
208
+ // PreToolUse
209
+ const preHooks = (hooks.PreToolUse ?? []);
210
+ const existingPreIdx = preHooks.findIndex((h) => h.hooks?.some((sub) => HOPPING_HOOK_PATTERN.test(sub.command)));
211
+ const preEntry = {
212
+ matcher: '',
213
+ hooks: [{ type: 'command', command: preCommand }],
214
+ };
215
+ if (existingPreIdx >= 0) {
216
+ preHooks[existingPreIdx] = preEntry;
217
+ }
218
+ else {
219
+ preHooks.push(preEntry);
220
+ }
221
+ hooks.PreToolUse = preHooks;
222
+ // PostToolUse
223
+ const postHooks = (hooks.PostToolUse ?? []);
224
+ const existingPostIdx = postHooks.findIndex((h) => h.hooks?.some((sub) => HOPPING_HOOK_PATTERN.test(sub.command)));
225
+ const postEntry = {
226
+ matcher: '',
227
+ hooks: [{ type: 'command', command: postCommand }],
228
+ };
229
+ if (existingPostIdx >= 0) {
230
+ postHooks[existingPostIdx] = postEntry;
231
+ }
232
+ else {
233
+ postHooks.push(postEntry);
234
+ }
235
+ hooks.PostToolUse = postHooks;
236
+ existing.hooks = hooks;
237
+ return writeJsonFile(hooksConfigPath, existing, options.dryRun);
238
+ }
239
+ /**
240
+ * 檢查 cursor-adapter.js 是否已實作(非空檔案)
241
+ */
242
+ function isCursorAdapterReady(adapterPath) {
243
+ if (!(0, node_fs_1.existsSync)(adapterPath))
244
+ return false;
245
+ try {
246
+ const stat = (0, node_fs_1.statSync)(adapterPath);
247
+ // 空檔案或只有換行的檔案視為未實作
248
+ if (stat.size <= 1)
249
+ return false;
250
+ const content = (0, node_fs_1.readFileSync)(adapterPath, 'utf-8').trim();
251
+ return content.length > 0;
252
+ }
253
+ catch {
254
+ return false;
255
+ }
256
+ }
257
+ /**
258
+ * 寫入 Cursor Hooks config(.cursor/hooks.json,扁平格式,camelCase,version: 1)
259
+ * 只有在 cursor-adapter.js 存在且已實作時才寫入
260
+ */
261
+ async function writeCursorHooks(hooksConfigPath, cursorAdapterPath, options) {
262
+ if (!isCursorAdapterReady(cursorAdapterPath)) {
263
+ return null; // 回傳 null 表示跳過
264
+ }
265
+ const existing = await readJsonFile(hooksConfigPath);
266
+ existing.version = 1;
267
+ const hooks = (existing.hooks ?? {});
268
+ const preCommand = `node "${cursorAdapterPath}" pre`;
269
+ const postCommand = `node "${cursorAdapterPath}" post`;
270
+ // preToolUse
271
+ const preHooks = (hooks.preToolUse ?? []);
272
+ const existingPreIdx = preHooks.findIndex((h) => HOPPING_HOOK_PATTERN.test(h.command));
273
+ const preEntry = { command: preCommand };
274
+ if (existingPreIdx >= 0) {
275
+ preHooks[existingPreIdx] = preEntry;
276
+ }
277
+ else {
278
+ preHooks.push(preEntry);
279
+ }
280
+ hooks.preToolUse = preHooks;
281
+ // postToolUse
282
+ const postHooks = (hooks.postToolUse ?? []);
283
+ const existingPostIdx = postHooks.findIndex((h) => HOPPING_HOOK_PATTERN.test(h.command));
284
+ const postEntry = { command: postCommand };
285
+ if (existingPostIdx >= 0) {
286
+ postHooks[existingPostIdx] = postEntry;
287
+ }
288
+ else {
289
+ postHooks.push(postEntry);
290
+ }
291
+ hooks.postToolUse = postHooks;
292
+ existing.hooks = hooks;
293
+ return writeJsonFile(hooksConfigPath, existing, options.dryRun);
294
+ }
295
+ /**
296
+ * 寫入 Hooks config(根據 agent 自動分派)
297
+ * 回傳 WriteResult(成功)、null(跳過,如 Cursor adapter 未實作)、或 'unsupported'(如 Codex)
298
+ */
299
+ async function writeHooksConfig(agent, options) {
300
+ if (!agent.supportsHooks) {
301
+ return 'unsupported';
302
+ }
303
+ if (options.skipHooks) {
304
+ return null;
305
+ }
306
+ const hooksConfigPath = agent.hooksConfigPath;
307
+ if (!hooksConfigPath) {
308
+ return 'unsupported';
309
+ }
310
+ if (agent.name === 'claude-code') {
311
+ return writeClaudeCodeHooks(hooksConfigPath, options);
312
+ }
313
+ if (agent.name === 'cursor') {
314
+ return writeCursorHooks(hooksConfigPath, options.cursorAdapterPath, options);
315
+ }
316
+ return 'unsupported';
317
+ }
318
+ //# sourceMappingURL=config-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/cli/config-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * CLI 入口 — Commander.js 子命令分派
39
+ *
40
+ * REQ-HUB-040: CLI Entry Point (bin)
41
+ *
42
+ * - No subcommand (or `serve`) → Start MCP Server (stdio transport)
43
+ * - `setup` → Execute setup CLI
44
+ * - `--help` or `-h` → Display usage information
45
+ */
46
+ const commander_1 = require("commander");
47
+ const setup_1 = require("./setup");
48
+ const program = new commander_1.Command();
49
+ program.name('hopping-hub').description('HopPing Hub — AI Agent Remote Control').version('0.1.0');
50
+ // Default command: start MCP Server
51
+ program
52
+ .command('serve', { isDefault: true })
53
+ .description('Start MCP Server (stdio transport)')
54
+ .action(async () => {
55
+ // 動態 import 原有 MCP Server 入口
56
+ await Promise.resolve().then(() => __importStar(require('../index')));
57
+ });
58
+ // Setup command
59
+ program
60
+ .command('setup')
61
+ .description('Interactive setup wizard — configure MCP, Hooks, and Skill for detected agents')
62
+ .option('-y, --yes', 'Skip confirmation prompt', false)
63
+ .option('--dry-run', 'Show planned changes without writing files', false)
64
+ .option('--scope <scope>', 'Config scope: project or user', 'project')
65
+ .option('--skip-hooks', 'Skip hooks configuration', false)
66
+ .option('--skip-skill', 'Skip skill auto-install', false)
67
+ .addOption(new commander_1.Option('--dev-mode <mode>', 'HOPPING_DEV_MODE value')
68
+ .choices(['isolated', 'allowlist', 'full'])
69
+ .default('full'))
70
+ .action(async (opts) => {
71
+ const flags = {
72
+ yes: opts.yes,
73
+ dryRun: opts.dryRun,
74
+ scope: opts.scope === 'user' ? 'user' : 'project',
75
+ skipHooks: opts.skipHooks,
76
+ skipSkill: opts.skipSkill,
77
+ devMode: opts.devMode,
78
+ };
79
+ await (0, setup_1.executeSetup)(flags);
80
+ });
81
+ program.parse(process.argv);
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;;;;;;;GAQG;AACH,yCAA4C;AAC5C,mCAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAElG,oCAAoC;AACpC,OAAO;KACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACrC,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,6BAA6B;IAC7B,wDAAa,UAAU,GAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gFAAgF,CAAC;KAC7F,MAAM,CAAC,WAAW,EAAE,0BAA0B,EAAE,KAAK,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,4CAA4C,EAAE,KAAK,CAAC;KACxE,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,SAAS,CAAC;KACrE,MAAM,CAAC,cAAc,EAAE,0BAA0B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,KAAK,CAAC;KACxD,SAAS,CACR,IAAI,kBAAM,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;KACtD,OAAO,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;KAC1C,OAAO,CAAC,MAAM,CAAC,CACnB;KACA,MAAM,CACL,KAAK,EAAE,IAON,EAAE,EAAE;IACH,MAAM,KAAK,GAAe;QACxB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACjD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IAEF,MAAM,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CACF,CAAC;AAEJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ export type InstallMode = 'npm' | 'local';
2
+ export type AgentName = 'claude-code' | 'cursor' | 'codex';
3
+ export interface DetectedAgent {
4
+ name: AgentName;
5
+ displayName: string;
6
+ configFormat: 'json' | 'toml';
7
+ /** MCP config 寫入路徑(project scope) */
8
+ mcpConfigPath: string;
9
+ /** MCP config 寫入路徑(user scope) */
10
+ globalMcpConfigPath: string;
11
+ supportsHooks: boolean;
12
+ /** Hooks config 寫入路徑(project scope,若支援 hooks) */
13
+ hooksConfigPath?: string;
14
+ }
15
+ export interface ResolvedPaths {
16
+ installMode: InstallMode;
17
+ hubCommand: string;
18
+ hubArgs: string[];
19
+ preHookPath: string;
20
+ postHookPath: string;
21
+ cursorAdapterPath: string;
22
+ detectedAgents: DetectedAgent[];
23
+ }
24
+ /**
25
+ * 偵測安裝模式:
26
+ * - npm mode: __dirname 包含 node_modules → 使用 npx
27
+ * - local mode: 直接使用 node 執行
28
+ */
29
+ export declare function detectInstallMode(dirname: string): InstallMode;
30
+ /**
31
+ * 偵測已安裝的 Agent(啟發式:檢查 home directory 下是否有對應設定目錄)
32
+ */
33
+ export declare function detectAgents(homeDir?: string, cwd?: string): DetectedAgent[];
34
+ /**
35
+ * 產生跨平台 Hook command
36
+ * - Unix: HOPPING_DEV_MODE=<mode> node <hookPath>
37
+ * - Windows: cmd /c "set HOPPING_DEV_MODE=<mode> && node <hookPath>"
38
+ */
39
+ export declare function buildPreHookCommand(hookPath: string, devMode: string, platform?: NodeJS.Platform): string;
40
+ /**
41
+ * PostToolUse hook 不需要 HOPPING_DEV_MODE(純觀測)
42
+ */
43
+ export declare function buildPostHookCommand(hookPath: string): string;
44
+ /**
45
+ * 完整路徑解析:偵測安裝模式、Agent、解析所有路徑
46
+ */
47
+ export declare function resolve(dirname?: string, homeDir?: string, cwd?: string): ResolvedPaths;
48
+ //# sourceMappingURL=path-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../src/cli/path-resolver.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC;AAE1C,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAyDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAE9D;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE,MAAqB,EAC9B,GAAG,GAAE,MAAsB,GAC1B,aAAa,EAAE,CAqBjB;AAyED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAMD;;GAEG;AACH,wBAAgB,OAAO,CACrB,OAAO,GAAE,MAAkB,EAC3B,OAAO,GAAE,MAAqB,EAC9B,GAAG,GAAE,MAAsB,GAC1B,aAAa,CAcf"}