@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,212 @@
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.detectInstallMode = detectInstallMode;
37
+ exports.detectAgents = detectAgents;
38
+ exports.buildPreHookCommand = buildPreHookCommand;
39
+ exports.buildPostHookCommand = buildPostHookCommand;
40
+ exports.resolve = resolve;
41
+ /**
42
+ * PathResolver — 安裝模式偵測 + Agent 偵測 + 路徑解析
43
+ *
44
+ * REQ-HUB-041: Setup CLI — Install Mode & Agent Detection
45
+ */
46
+ const fs = __importStar(require("node:fs"));
47
+ const os = __importStar(require("node:os"));
48
+ const path = __importStar(require("node:path"));
49
+ const AGENT_DEFINITIONS = [
50
+ {
51
+ name: 'claude-code',
52
+ displayName: 'Claude Code',
53
+ detectDir: '.claude',
54
+ configFormat: 'json',
55
+ mcpConfigRelative: '.mcp.json',
56
+ globalMcpConfigRelative: '.claude.json',
57
+ supportsHooks: true,
58
+ hooksConfigRelative: '.claude/settings.json',
59
+ },
60
+ {
61
+ name: 'cursor',
62
+ displayName: 'Cursor',
63
+ detectDir: '.cursor',
64
+ configFormat: 'json',
65
+ mcpConfigRelative: '.cursor/mcp.json',
66
+ globalMcpConfigRelative: '.cursor/mcp.json',
67
+ supportsHooks: true,
68
+ hooksConfigRelative: '.cursor/hooks.json',
69
+ },
70
+ {
71
+ name: 'codex',
72
+ displayName: 'Codex',
73
+ detectDir: '.codex',
74
+ configFormat: 'toml',
75
+ mcpConfigRelative: '.codex/config.toml',
76
+ globalMcpConfigRelative: '.codex/config.toml',
77
+ supportsHooks: false,
78
+ },
79
+ ];
80
+ // ============================================
81
+ // Install Mode Detection (REQ-HUB-041)
82
+ // ============================================
83
+ /**
84
+ * 偵測安裝模式:
85
+ * - npm mode: __dirname 包含 node_modules → 使用 npx
86
+ * - local mode: 直接使用 node 執行
87
+ */
88
+ function detectInstallMode(dirname) {
89
+ return dirname.includes('node_modules') ? 'npm' : 'local';
90
+ }
91
+ // ============================================
92
+ // Agent Detection (REQ-HUB-041)
93
+ // ============================================
94
+ /**
95
+ * 偵測已安裝的 Agent(啟發式:檢查 home directory 下是否有對應設定目錄)
96
+ */
97
+ function detectAgents(homeDir = os.homedir(), cwd = process.cwd()) {
98
+ const agents = [];
99
+ for (const def of AGENT_DEFINITIONS) {
100
+ const detectPath = path.join(homeDir, def.detectDir);
101
+ if (fs.existsSync(detectPath)) {
102
+ agents.push({
103
+ name: def.name,
104
+ displayName: def.displayName,
105
+ configFormat: def.configFormat,
106
+ mcpConfigPath: path.join(cwd, def.mcpConfigRelative),
107
+ globalMcpConfigPath: path.join(homeDir, def.globalMcpConfigRelative),
108
+ supportsHooks: def.supportsHooks,
109
+ hooksConfigPath: def.hooksConfigRelative
110
+ ? path.join(cwd, def.hooksConfigRelative)
111
+ : undefined,
112
+ });
113
+ }
114
+ }
115
+ return agents;
116
+ }
117
+ // ============================================
118
+ // Hub Command Resolution
119
+ // ============================================
120
+ /**
121
+ * 解析 Hub MCP Server 啟動指令(用於寫入 MCP config)
122
+ */
123
+ function resolveHubCommand(installMode, dirname) {
124
+ if (installMode === 'npm') {
125
+ return { command: 'npx', args: ['@hopping-dev/hub'] };
126
+ }
127
+ // local mode: 使用絕對路徑指向 dist/index.js
128
+ const hubRoot = findHubRoot(dirname);
129
+ return { command: 'node', args: [path.join(hubRoot, 'dist', 'index.js')] };
130
+ }
131
+ /**
132
+ * 從 CLI 模組的 dirname 往上找到 hub package 根目錄
133
+ */
134
+ function findHubRoot(dirname) {
135
+ // dirname 可能是 packages/hub/dist/cli/ 或 packages/hub/src/cli/
136
+ let current = dirname;
137
+ for (let i = 0; i < 5; i++) {
138
+ const pkgJson = path.join(current, 'package.json');
139
+ if (fs.existsSync(pkgJson)) {
140
+ try {
141
+ const pkg = JSON.parse(fs.readFileSync(pkgJson, 'utf-8'));
142
+ if (pkg.name === '@hopping-dev/hub') {
143
+ return current;
144
+ }
145
+ }
146
+ catch {
147
+ // ignore parse errors
148
+ }
149
+ }
150
+ current = path.dirname(current);
151
+ }
152
+ // fallback: assume 2 levels up from cli/
153
+ return path.resolve(dirname, '..', '..');
154
+ }
155
+ // ============================================
156
+ // Hook Path Resolution (REQ-HUB-043)
157
+ // ============================================
158
+ /**
159
+ * 解析 Hook 腳本的絕對路徑
160
+ */
161
+ function resolveHookPaths(dirname) {
162
+ const hubRoot = findHubRoot(dirname);
163
+ // hooks 套件在 monorepo 中與 hub 同層
164
+ const hooksDir = path.resolve(hubRoot, '..', 'hooks', 'hooks');
165
+ const adapterDir = path.resolve(hubRoot, '..', 'hooks');
166
+ return {
167
+ preHookPath: path.join(hooksDir, 'pre-tool-use.js'),
168
+ postHookPath: path.join(hooksDir, 'post-tool-use.js'),
169
+ cursorAdapterPath: path.join(adapterDir, 'cursor-adapter.js'),
170
+ };
171
+ }
172
+ // ============================================
173
+ // Cross-Platform Hook Commands (REQ-HUB-043)
174
+ // ============================================
175
+ /**
176
+ * 產生跨平台 Hook command
177
+ * - Unix: HOPPING_DEV_MODE=<mode> node <hookPath>
178
+ * - Windows: cmd /c "set HOPPING_DEV_MODE=<mode> && node <hookPath>"
179
+ */
180
+ function buildPreHookCommand(hookPath, devMode, platform = process.platform) {
181
+ if (platform === 'win32') {
182
+ return `cmd /c "set HOPPING_DEV_MODE=${devMode} && node ""${hookPath}"""`;
183
+ }
184
+ return `HOPPING_DEV_MODE=${devMode} node "${hookPath}"`;
185
+ }
186
+ /**
187
+ * PostToolUse hook 不需要 HOPPING_DEV_MODE(純觀測)
188
+ */
189
+ function buildPostHookCommand(hookPath) {
190
+ return `node "${hookPath}"`;
191
+ }
192
+ // ============================================
193
+ // Main Resolver
194
+ // ============================================
195
+ /**
196
+ * 完整路徑解析:偵測安裝模式、Agent、解析所有路徑
197
+ */
198
+ function resolve(dirname = __dirname, homeDir = os.homedir(), cwd = process.cwd()) {
199
+ const installMode = detectInstallMode(dirname);
200
+ const { command, args } = resolveHubCommand(installMode, dirname);
201
+ const hookPaths = resolveHookPaths(dirname);
202
+ return {
203
+ installMode,
204
+ hubCommand: command,
205
+ hubArgs: args,
206
+ preHookPath: hookPaths.preHookPath,
207
+ postHookPath: hookPaths.postHookPath,
208
+ cursorAdapterPath: hookPaths.cursorAdapterPath,
209
+ detectedAgents: detectAgents(homeDir, cwd),
210
+ };
211
+ }
212
+ //# sourceMappingURL=path-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../src/cli/path-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface SetupFlags {
2
+ yes: boolean;
3
+ dryRun: boolean;
4
+ scope: 'project' | 'user';
5
+ skipHooks: boolean;
6
+ skipSkill: boolean;
7
+ devMode: string;
8
+ }
9
+ export declare function executeSetup(flags: SetupFlags, dirname?: string): Promise<void>;
10
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAwKD,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoGhG"}
@@ -0,0 +1,268 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.executeSetup = executeSetup;
40
+ /**
41
+ * Setup CLI — 互動式多 Agent 安裝主流程
42
+ *
43
+ * REQ-HUB-044: Setup CLI — Interactive Flow & Skill Auto-Install
44
+ */
45
+ const readline = __importStar(require("node:readline"));
46
+ const fs = __importStar(require("node:fs"));
47
+ const path = __importStar(require("node:path"));
48
+ const chalk_1 = __importDefault(require("chalk"));
49
+ const path_resolver_1 = require("./path-resolver");
50
+ const config_writer_1 = require("./config-writer");
51
+ // ============================================
52
+ // Interactive Helpers
53
+ // ============================================
54
+ async function confirm(message) {
55
+ const rl = readline.createInterface({
56
+ input: process.stdin,
57
+ output: process.stderr,
58
+ });
59
+ return new Promise((done) => {
60
+ rl.question(`${message} (Y/n) `, (answer) => {
61
+ rl.close();
62
+ const trimmed = answer.trim().toLowerCase();
63
+ done(trimmed === '' || trimmed === 'y' || trimmed === 'yes');
64
+ });
65
+ });
66
+ }
67
+ // ============================================
68
+ // Skill Install Helpers
69
+ // ============================================
70
+ function getSkillInstallDir(agentName) {
71
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
72
+ switch (agentName) {
73
+ case 'claude-code':
74
+ return path.join(home, '.claude', 'skills', 'hopping-skill');
75
+ case 'cursor':
76
+ return path.join(home, '.cursor', 'skills', 'hopping-skill');
77
+ default:
78
+ return path.join(home, '.claude', 'skills', 'hopping-skill');
79
+ }
80
+ }
81
+ function getBundledSkillPath(dirname) {
82
+ // When running from dist/cli/setup.js → assets is at ../../assets
83
+ const fromDist = path.resolve(dirname, '..', '..', 'assets', 'hopping-skill', 'SKILL.md');
84
+ if (fs.existsSync(fromDist))
85
+ return fromDist;
86
+ // When running from src/cli/setup.ts (dev mode) → assets is at ../../assets
87
+ const fromSrc = path.resolve(dirname, '..', '..', 'assets', 'hopping-skill', 'SKILL.md');
88
+ if (fs.existsSync(fromSrc))
89
+ return fromSrc;
90
+ // Fallback: monorepo path
91
+ const monoRepo = path.resolve(dirname, '..', '..', '..', 'skill', 'skills', 'hopping-skill', 'SKILL.md');
92
+ if (fs.existsSync(monoRepo))
93
+ return monoRepo;
94
+ return fromDist; // Will fail with clear error
95
+ }
96
+ function installSkill(agentName, dirname, dryRun) {
97
+ const targetDir = getSkillInstallDir(agentName);
98
+ const targetFile = path.join(targetDir, 'SKILL.md');
99
+ const sourcePath = getBundledSkillPath(dirname);
100
+ if (dryRun) {
101
+ return { dir: targetDir, action: 'would write' };
102
+ }
103
+ fs.mkdirSync(targetDir, { recursive: true });
104
+ fs.copyFileSync(sourcePath, targetFile);
105
+ return { dir: targetDir, action: fs.existsSync(targetFile) ? 'updated' : 'created' };
106
+ }
107
+ // ============================================
108
+ // Display Plan (REQ-HUB-044)
109
+ // ============================================
110
+ function displayPlan(resolved, flags) {
111
+ const log = (msg) => {
112
+ console.error(msg);
113
+ };
114
+ log('');
115
+ log(chalk_1.default.bold.yellow(' HopPing Setup — AI Agent Remote Control'));
116
+ log('');
117
+ log(` Install mode: ${chalk_1.default.cyan(resolved.installMode === 'npm' ? 'npm (npx)' : 'local (monorepo)')}`);
118
+ if (resolved.detectedAgents.length === 0) {
119
+ log(chalk_1.default.yellow(' No agents detected. Install Claude Code, Cursor, or Codex first.'));
120
+ return;
121
+ }
122
+ log(` Detected agents: ${chalk_1.default.cyan(resolved.detectedAgents.map((a) => a.displayName).join(', '))}`);
123
+ log('');
124
+ log(chalk_1.default.bold(' Planned changes:'));
125
+ log('');
126
+ // 1. MCP Server
127
+ log(chalk_1.default.bold(' 1. MCP Server'));
128
+ for (const agent of resolved.detectedAgents) {
129
+ const configPath = flags.scope === 'project' ? agent.mcpConfigPath : agent.globalMcpConfigPath;
130
+ log(` ${chalk_1.default.green('+')} ${agent.displayName} ${chalk_1.default.dim(`-> ${configPath}`)}`);
131
+ log(` Command: ${resolved.hubCommand} ${resolved.hubArgs.join(' ')}`);
132
+ log(` Env: HOPPING_DEV_MODE=${flags.devMode}`);
133
+ }
134
+ log('');
135
+ // 2. Hooks
136
+ if (!flags.skipHooks) {
137
+ log(chalk_1.default.bold(' 2. Hooks'));
138
+ for (const agent of resolved.detectedAgents) {
139
+ if (!agent.supportsHooks) {
140
+ log(` ${chalk_1.default.dim('-')} ${agent.displayName} ${chalk_1.default.dim('(not supported)')}`);
141
+ continue;
142
+ }
143
+ if (agent.name === 'cursor' && !(0, config_writer_1.isCursorAdapterReady)(resolved.cursorAdapterPath)) {
144
+ log(` ${chalk_1.default.dim('-')} ${agent.displayName} ${chalk_1.default.dim('(skipped: cursor-adapter.js not implemented, see S4-HOOK-CURSOR-001)')}`);
145
+ continue;
146
+ }
147
+ log(` ${chalk_1.default.green('+')} ${agent.displayName} ${chalk_1.default.dim(`-> ${agent.hooksConfigPath}`)}`);
148
+ if (agent.name === 'claude-code') {
149
+ log(` PreToolUse: ${(0, path_resolver_1.buildPreHookCommand)(resolved.preHookPath, flags.devMode)}`);
150
+ log(` PostToolUse: ${(0, path_resolver_1.buildPostHookCommand)(resolved.postHookPath)}`);
151
+ }
152
+ else if (agent.name === 'cursor') {
153
+ log(` preToolUse: node ${resolved.cursorAdapterPath} pre`);
154
+ log(` postToolUse: node ${resolved.cursorAdapterPath} post`);
155
+ }
156
+ }
157
+ log('');
158
+ }
159
+ // 3. Skill
160
+ if (!flags.skipSkill) {
161
+ log(chalk_1.default.bold(' 3. Skill (bundled SKILL.md)'));
162
+ for (const agent of resolved.detectedAgents) {
163
+ const skillDir = getSkillInstallDir(agent.name);
164
+ log(` ${chalk_1.default.green('+')} ${agent.displayName} ${chalk_1.default.dim(`-> ${skillDir}`)}`);
165
+ }
166
+ log('');
167
+ }
168
+ if (flags.dryRun) {
169
+ log(chalk_1.default.yellow(' [dry-run] No files will be written.'));
170
+ log('');
171
+ }
172
+ }
173
+ // ============================================
174
+ // Execute Setup (REQ-HUB-044)
175
+ // ============================================
176
+ async function executeSetup(flags, dirname = __dirname) {
177
+ const log = (msg) => {
178
+ console.error(msg);
179
+ };
180
+ // 1. Resolve paths
181
+ const resolved = (0, path_resolver_1.resolve)(dirname);
182
+ // 2. Display plan
183
+ displayPlan(resolved, flags);
184
+ if (resolved.detectedAgents.length === 0) {
185
+ log(chalk_1.default.yellow(' No agents detected. Nothing to do.'));
186
+ process.exitCode = 1;
187
+ return;
188
+ }
189
+ // 3. Confirm
190
+ if (!flags.yes && !flags.dryRun) {
191
+ const ok = await confirm(chalk_1.default.bold(' Proceed?'));
192
+ if (!ok) {
193
+ log(chalk_1.default.yellow(' Aborted.'));
194
+ return;
195
+ }
196
+ log('');
197
+ }
198
+ // Build write options
199
+ const writeOptions = {
200
+ hubCommand: resolved.hubCommand,
201
+ hubArgs: resolved.hubArgs,
202
+ devMode: flags.devMode,
203
+ preHookPath: resolved.preHookPath,
204
+ postHookPath: resolved.postHookPath,
205
+ cursorAdapterPath: resolved.cursorAdapterPath,
206
+ scope: flags.scope,
207
+ skipHooks: flags.skipHooks,
208
+ dryRun: flags.dryRun,
209
+ };
210
+ // 4. Write MCP config per agent
211
+ for (const agent of resolved.detectedAgents) {
212
+ const result = await (0, config_writer_1.writeMcpConfig)(agent, writeOptions);
213
+ const icon = flags.dryRun ? chalk_1.default.dim('[dry-run]') : chalk_1.default.green(' OK');
214
+ log(`${icon} ${agent.displayName} MCP config ${result.action} (${result.path})`);
215
+ if (result.backedUp) {
216
+ log(chalk_1.default.dim(` backup: ${result.path}.bak`));
217
+ }
218
+ }
219
+ // 5. Write Hooks config per agent
220
+ if (!flags.skipHooks) {
221
+ for (const agent of resolved.detectedAgents) {
222
+ const result = await (0, config_writer_1.writeHooksConfig)(agent, writeOptions);
223
+ if (result === 'unsupported') {
224
+ log(chalk_1.default.dim(` -- ${agent.displayName} hooks: not supported`));
225
+ }
226
+ else if (result === null) {
227
+ if (agent.name === 'cursor') {
228
+ log(chalk_1.default.yellow(` >> ${agent.displayName} hooks: skipped (cursor-adapter.js not implemented, re-run setup after S4-HOOK-CURSOR-001)`));
229
+ }
230
+ else {
231
+ log(chalk_1.default.dim(` -- ${agent.displayName} hooks: skipped`));
232
+ }
233
+ }
234
+ else {
235
+ const icon = flags.dryRun ? chalk_1.default.dim('[dry-run]') : chalk_1.default.green(' OK');
236
+ log(`${icon} ${agent.displayName} hooks ${result.action} (${result.path})`);
237
+ if (result.backedUp) {
238
+ log(chalk_1.default.dim(` backup: ${result.path}.bak`));
239
+ }
240
+ }
241
+ }
242
+ }
243
+ // 6. Install bundled Skill (SKILL.md) per agent
244
+ if (!flags.skipSkill) {
245
+ log('');
246
+ for (const agent of resolved.detectedAgents) {
247
+ try {
248
+ const result = installSkill(agent.name, dirname, flags.dryRun);
249
+ const icon = flags.dryRun ? chalk_1.default.dim('[dry-run]') : chalk_1.default.green(' OK');
250
+ log(`${icon} ${agent.displayName} Skill ${result.action} (${result.dir})`);
251
+ }
252
+ catch (err) {
253
+ log(chalk_1.default.yellow(` !! ${agent.displayName} Skill install failed: ${err}`));
254
+ }
255
+ }
256
+ }
257
+ // 7. Completion summary
258
+ log('');
259
+ log(chalk_1.default.bold.green(' HopPing setup complete!'));
260
+ log('');
261
+ log(chalk_1.default.bold(' Next steps:'));
262
+ log(' 1. Start Backend: pnpm --filter backend dev');
263
+ log(' 2. Hub will be auto-started by your Agent (via MCP config)');
264
+ log(' 3. On first launch, scan the QR Code with HopPing mobile app');
265
+ log(' 4. Enjoy your coffee');
266
+ log('');
267
+ }
268
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { PermissionPromptPayload, AgentStatusPayload, AgentMode, ProgressUpdatePayload, DetailResponsePayload, StatsResponsePayload } from '@hopping/shared';
2
+ import type { SessionMemory } from '../approval/session-memory';
3
+ import type { ApprovalManager } from '../approval/manager';
4
+ import type { HubDatabase } from '../store';
5
+ import type { Logger } from '../utils/logger';
6
+ export interface CloudConnectorOptions {
7
+ cloudUrl: string;
8
+ agentToken: string;
9
+ logger: Logger;
10
+ approvalManager: ApprovalManager;
11
+ store?: HubDatabase;
12
+ connectTimeoutMs?: number;
13
+ /** YOLO 模式偵測 getter(S4-HUB-YOLO-001):連線/重連後發送 agent_status 時帶入 agentMode */
14
+ getAgentMode?: () => AgentMode;
15
+ /** S4-HUB-DONTASK-001:Session 免審記憶 */
16
+ sessionMemory?: SessionMemory;
17
+ }
18
+ /**
19
+ * CloudConnector — Hub 端的 socket.io-client 封裝
20
+ *
21
+ * 負責:
22
+ * 1. 使用 agent token 連接 Cloud Gateway
23
+ * 2. Hub → Cloud 事件發送(permission_prompt, agent_status, progress_update, detail_response, stats_response)
24
+ * 3. Cloud → Hub 事件接收(permission_response, detail_request, stats_request, command)
25
+ * 4. 優雅降級:連線失敗不阻擋 MCP Server 運行
26
+ */
27
+ export declare class CloudConnector {
28
+ private socket;
29
+ private _connected;
30
+ private logger;
31
+ private approvalManager;
32
+ private store?;
33
+ private connectTimeoutMs;
34
+ /** YOLO 模式偵測 getter(可選) */
35
+ private getAgentMode?;
36
+ /** ENH-YOLO-002:記住 YOLO 進入時間,避免重連時重置 Mobile 計時器 */
37
+ private _yoloEnteredAt?;
38
+ /** S4-HUB-DONTASK-001:Session 免審記憶 */
39
+ private sessionMemory?;
40
+ /** Cloud 認證後回傳的 agentId(Cloud DB 中的 UUID) */
41
+ private _agentId?;
42
+ /** Cloud 認證後回傳的 agentName */
43
+ private _agentName?;
44
+ constructor(options: CloudConnectorOptions);
45
+ /**
46
+ * 連接 Cloud Gateway 並等待認證結果
47
+ *
48
+ * - 成功:_connected = true(由持久 authenticated listener 設定)
49
+ * - 失敗/超時:_connected = false,不 throw(Hub 降級為純本地模式)
50
+ *
51
+ * 注意:自動重連由 socket.io 在背景持續嘗試,connect() 僅處理初始握手超時。
52
+ */
53
+ connect(): Promise<void>;
54
+ /**
55
+ * 斷開連線並清理資源
56
+ */
57
+ disconnect(): Promise<void>;
58
+ get isConnected(): boolean;
59
+ get cloudAgentId(): string | undefined;
60
+ get cloudAgentName(): string | undefined;
61
+ sendPermissionPrompt(payload: PermissionPromptPayload): void;
62
+ sendAgentStatus(payload: AgentStatusPayload): void;
63
+ sendProgressUpdate(payload: ProgressUpdatePayload): void;
64
+ sendDetailResponse(payload: DetailResponsePayload): void;
65
+ sendStatsResponse(payload: StatsResponsePayload): void;
66
+ private bindEventListeners;
67
+ private handlePermissionResponse;
68
+ private sendDetailError;
69
+ private handleDetailRequest;
70
+ private calculateDateRange;
71
+ private handleStatsRequest;
72
+ private handleCommand;
73
+ }
74
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../src/cloud/connector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EAErB,oBAAoB,EAQrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAO9C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,SAAS,CAAC;IAC/B,sCAAsC;IACtC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AA+BD;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,2BAA2B;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAkB;IACvC,mDAAmD;IACnD,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,sCAAsC;IACtC,OAAO,CAAC,aAAa,CAAC,CAAgB;IAEtC,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,CAAS;IAE1B,6BAA6B;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,OAAO,EAAE,qBAAqB;IAuB1C;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED,IAAI,cAAc,IAAI,MAAM,GAAG,SAAS,CAEvC;IAID,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAY5D,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAYlD,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAWxD,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAWxD,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAatD,OAAO,CAAC,kBAAkB;IA2G1B,OAAO,CAAC,wBAAwB;IAgDhC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,mBAAmB;IA0D3B,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,kBAAkB;IAuE1B,OAAO,CAAC,aAAa;CAoEtB"}