hoolix 0.0.1-beta.19

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 (263) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/STABILITY.md +109 -0
  4. package/bin/hoolix.js +50 -0
  5. package/bin/mcp-portal.js +12 -0
  6. package/bin/postinstall.js +61 -0
  7. package/dist/app/contracts.d.ts +105 -0
  8. package/dist/app/contracts.d.ts.map +1 -0
  9. package/dist/app/contracts.js +2 -0
  10. package/dist/app/contracts.js.map +1 -0
  11. package/dist/app/events.d.ts +13 -0
  12. package/dist/app/events.d.ts.map +1 -0
  13. package/dist/app/events.js +13 -0
  14. package/dist/app/events.js.map +1 -0
  15. package/dist/app/services/analytics.d.ts +42 -0
  16. package/dist/app/services/analytics.d.ts.map +1 -0
  17. package/dist/app/services/analytics.js +106 -0
  18. package/dist/app/services/analytics.js.map +1 -0
  19. package/dist/app/services/catalog.d.ts +14 -0
  20. package/dist/app/services/catalog.d.ts.map +1 -0
  21. package/dist/app/services/catalog.js +26 -0
  22. package/dist/app/services/catalog.js.map +1 -0
  23. package/dist/app/services/credentials.d.ts +42 -0
  24. package/dist/app/services/credentials.d.ts.map +1 -0
  25. package/dist/app/services/credentials.js +143 -0
  26. package/dist/app/services/credentials.js.map +1 -0
  27. package/dist/app/services/servers.d.ts +15 -0
  28. package/dist/app/services/servers.d.ts.map +1 -0
  29. package/dist/app/services/servers.js +445 -0
  30. package/dist/app/services/servers.js.map +1 -0
  31. package/dist/catalog/community.d.ts +19 -0
  32. package/dist/catalog/community.d.ts.map +1 -0
  33. package/dist/catalog/community.js +53 -0
  34. package/dist/catalog/community.js.map +1 -0
  35. package/dist/catalog/templates.d.ts +436 -0
  36. package/dist/catalog/templates.d.ts.map +1 -0
  37. package/dist/catalog/templates.js +489 -0
  38. package/dist/catalog/templates.js.map +1 -0
  39. package/dist/commands/audit.d.ts +2 -0
  40. package/dist/commands/audit.d.ts.map +1 -0
  41. package/dist/commands/audit.js +122 -0
  42. package/dist/commands/audit.js.map +1 -0
  43. package/dist/commands/bundle.d.ts +11 -0
  44. package/dist/commands/bundle.d.ts.map +1 -0
  45. package/dist/commands/bundle.js +299 -0
  46. package/dist/commands/bundle.js.map +1 -0
  47. package/dist/commands/clients.d.ts +6 -0
  48. package/dist/commands/clients.d.ts.map +1 -0
  49. package/dist/commands/clients.js +242 -0
  50. package/dist/commands/clients.js.map +1 -0
  51. package/dist/commands/completion.d.ts +18 -0
  52. package/dist/commands/completion.d.ts.map +1 -0
  53. package/dist/commands/completion.js +495 -0
  54. package/dist/commands/completion.js.map +1 -0
  55. package/dist/commands/connect.d.ts +10 -0
  56. package/dist/commands/connect.d.ts.map +1 -0
  57. package/dist/commands/connect.js +463 -0
  58. package/dist/commands/connect.js.map +1 -0
  59. package/dist/commands/create.d.ts +2 -0
  60. package/dist/commands/create.d.ts.map +1 -0
  61. package/dist/commands/create.js +607 -0
  62. package/dist/commands/create.js.map +1 -0
  63. package/dist/commands/delete.d.ts +2 -0
  64. package/dist/commands/delete.d.ts.map +1 -0
  65. package/dist/commands/delete.js +44 -0
  66. package/dist/commands/delete.js.map +1 -0
  67. package/dist/commands/doctor.d.ts +2 -0
  68. package/dist/commands/doctor.d.ts.map +1 -0
  69. package/dist/commands/doctor.js +259 -0
  70. package/dist/commands/doctor.js.map +1 -0
  71. package/dist/commands/export.d.ts +2 -0
  72. package/dist/commands/export.d.ts.map +1 -0
  73. package/dist/commands/export.js +93 -0
  74. package/dist/commands/export.js.map +1 -0
  75. package/dist/commands/gui.d.ts +2 -0
  76. package/dist/commands/gui.d.ts.map +1 -0
  77. package/dist/commands/gui.js +19 -0
  78. package/dist/commands/gui.js.map +1 -0
  79. package/dist/commands/import.d.ts +2 -0
  80. package/dist/commands/import.d.ts.map +1 -0
  81. package/dist/commands/import.js +102 -0
  82. package/dist/commands/import.js.map +1 -0
  83. package/dist/commands/info.d.ts +2 -0
  84. package/dist/commands/info.d.ts.map +1 -0
  85. package/dist/commands/info.js +151 -0
  86. package/dist/commands/info.js.map +1 -0
  87. package/dist/commands/list.d.ts +2 -0
  88. package/dist/commands/list.d.ts.map +1 -0
  89. package/dist/commands/list.js +90 -0
  90. package/dist/commands/list.js.map +1 -0
  91. package/dist/commands/reindex.d.ts +2 -0
  92. package/dist/commands/reindex.d.ts.map +1 -0
  93. package/dist/commands/reindex.js +186 -0
  94. package/dist/commands/reindex.js.map +1 -0
  95. package/dist/commands/rotate.d.ts +2 -0
  96. package/dist/commands/rotate.d.ts.map +1 -0
  97. package/dist/commands/rotate.js +67 -0
  98. package/dist/commands/rotate.js.map +1 -0
  99. package/dist/commands/secrets.d.ts +10 -0
  100. package/dist/commands/secrets.d.ts.map +1 -0
  101. package/dist/commands/secrets.js +293 -0
  102. package/dist/commands/secrets.js.map +1 -0
  103. package/dist/commands/start.d.ts +2 -0
  104. package/dist/commands/start.d.ts.map +1 -0
  105. package/dist/commands/start.js +234 -0
  106. package/dist/commands/start.js.map +1 -0
  107. package/dist/commands/stats.d.ts +2 -0
  108. package/dist/commands/stats.d.ts.map +1 -0
  109. package/dist/commands/stats.js +220 -0
  110. package/dist/commands/stats.js.map +1 -0
  111. package/dist/commands/stop.d.ts +2 -0
  112. package/dist/commands/stop.d.ts.map +1 -0
  113. package/dist/commands/stop.js +24 -0
  114. package/dist/commands/stop.js.map +1 -0
  115. package/dist/commands/templates.d.ts +2 -0
  116. package/dist/commands/templates.d.ts.map +1 -0
  117. package/dist/commands/templates.js +168 -0
  118. package/dist/commands/templates.js.map +1 -0
  119. package/dist/commands/trial.d.ts +2 -0
  120. package/dist/commands/trial.d.ts.map +1 -0
  121. package/dist/commands/trial.js +61 -0
  122. package/dist/commands/trial.js.map +1 -0
  123. package/dist/commands/uninstall.d.ts +2 -0
  124. package/dist/commands/uninstall.d.ts.map +1 -0
  125. package/dist/commands/uninstall.js +114 -0
  126. package/dist/commands/uninstall.js.map +1 -0
  127. package/dist/commands/update.d.ts +2 -0
  128. package/dist/commands/update.d.ts.map +1 -0
  129. package/dist/commands/update.js +104 -0
  130. package/dist/commands/update.js.map +1 -0
  131. package/dist/commands/verify.d.ts +2 -0
  132. package/dist/commands/verify.d.ts.map +1 -0
  133. package/dist/commands/verify.js +301 -0
  134. package/dist/commands/verify.js.map +1 -0
  135. package/dist/core/config.d.ts +25 -0
  136. package/dist/core/config.d.ts.map +1 -0
  137. package/dist/core/config.js +54 -0
  138. package/dist/core/config.js.map +1 -0
  139. package/dist/core/errors.d.ts +25 -0
  140. package/dist/core/errors.d.ts.map +1 -0
  141. package/dist/core/errors.js +53 -0
  142. package/dist/core/errors.js.map +1 -0
  143. package/dist/core/logger.d.ts +3 -0
  144. package/dist/core/logger.d.ts.map +1 -0
  145. package/dist/core/logger.js +12 -0
  146. package/dist/core/logger.js.map +1 -0
  147. package/dist/core/paths.d.ts +15 -0
  148. package/dist/core/paths.d.ts.map +1 -0
  149. package/dist/core/paths.js +51 -0
  150. package/dist/core/paths.js.map +1 -0
  151. package/dist/core/registry.d.ts +474 -0
  152. package/dist/core/registry.d.ts.map +1 -0
  153. package/dist/core/registry.js +186 -0
  154. package/dist/core/registry.js.map +1 -0
  155. package/dist/core/updater.d.ts +16 -0
  156. package/dist/core/updater.d.ts.map +1 -0
  157. package/dist/core/updater.js +317 -0
  158. package/dist/core/updater.js.map +1 -0
  159. package/dist/core/version.d.ts +2 -0
  160. package/dist/core/version.d.ts.map +1 -0
  161. package/dist/core/version.js +3 -0
  162. package/dist/core/version.js.map +1 -0
  163. package/dist/index.d.ts +13 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +270 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/ingestion/chunker.d.ts +13 -0
  168. package/dist/ingestion/chunker.d.ts.map +1 -0
  169. package/dist/ingestion/chunker.js +107 -0
  170. package/dist/ingestion/chunker.js.map +1 -0
  171. package/dist/ingestion/cleaners.d.ts +10 -0
  172. package/dist/ingestion/cleaners.d.ts.map +1 -0
  173. package/dist/ingestion/cleaners.js +61 -0
  174. package/dist/ingestion/cleaners.js.map +1 -0
  175. package/dist/ingestion/detectors.d.ts +5 -0
  176. package/dist/ingestion/detectors.d.ts.map +1 -0
  177. package/dist/ingestion/detectors.js +25 -0
  178. package/dist/ingestion/detectors.js.map +1 -0
  179. package/dist/ingestion/fetchers.d.ts +38 -0
  180. package/dist/ingestion/fetchers.d.ts.map +1 -0
  181. package/dist/ingestion/fetchers.js +296 -0
  182. package/dist/ingestion/fetchers.js.map +1 -0
  183. package/dist/ingestion/github.d.ts +60 -0
  184. package/dist/ingestion/github.d.ts.map +1 -0
  185. package/dist/ingestion/github.js +314 -0
  186. package/dist/ingestion/github.js.map +1 -0
  187. package/dist/ingestion/pipeline.d.ts +3 -0
  188. package/dist/ingestion/pipeline.d.ts.map +1 -0
  189. package/dist/ingestion/pipeline.js +160 -0
  190. package/dist/ingestion/pipeline.js.map +1 -0
  191. package/dist/ingestion/types.d.ts +51 -0
  192. package/dist/ingestion/types.d.ts.map +1 -0
  193. package/dist/ingestion/types.js +2 -0
  194. package/dist/ingestion/types.js.map +1 -0
  195. package/dist/lib/auth.d.ts +2 -0
  196. package/dist/lib/auth.d.ts.map +1 -0
  197. package/dist/lib/auth.js +6 -0
  198. package/dist/lib/auth.js.map +1 -0
  199. package/dist/lib/embedding.d.ts +10 -0
  200. package/dist/lib/embedding.d.ts.map +1 -0
  201. package/dist/lib/embedding.js +21 -0
  202. package/dist/lib/embedding.js.map +1 -0
  203. package/dist/mcp/host.d.ts +16 -0
  204. package/dist/mcp/host.d.ts.map +1 -0
  205. package/dist/mcp/host.js +307 -0
  206. package/dist/mcp/host.js.map +1 -0
  207. package/dist/mcp/proxy-host.d.ts +25 -0
  208. package/dist/mcp/proxy-host.d.ts.map +1 -0
  209. package/dist/mcp/proxy-host.js +393 -0
  210. package/dist/mcp/proxy-host.js.map +1 -0
  211. package/dist/mcp/stdio-host.d.ts +19 -0
  212. package/dist/mcp/stdio-host.d.ts.map +1 -0
  213. package/dist/mcp/stdio-host.js +175 -0
  214. package/dist/mcp/stdio-host.js.map +1 -0
  215. package/dist/process/manager.d.ts +74 -0
  216. package/dist/process/manager.d.ts.map +1 -0
  217. package/dist/process/manager.js +322 -0
  218. package/dist/process/manager.js.map +1 -0
  219. package/dist/rag/models.d.ts +30 -0
  220. package/dist/rag/models.d.ts.map +1 -0
  221. package/dist/rag/models.js +30 -0
  222. package/dist/rag/models.js.map +1 -0
  223. package/dist/rag/store.d.ts +63 -0
  224. package/dist/rag/store.d.ts.map +1 -0
  225. package/dist/rag/store.js +505 -0
  226. package/dist/rag/store.js.map +1 -0
  227. package/dist/rag/types.d.ts +56 -0
  228. package/dist/rag/types.d.ts.map +1 -0
  229. package/dist/rag/types.js +2 -0
  230. package/dist/rag/types.js.map +1 -0
  231. package/dist/sources/plugins.d.ts +25 -0
  232. package/dist/sources/plugins.d.ts.map +1 -0
  233. package/dist/sources/plugins.js +55 -0
  234. package/dist/sources/plugins.js.map +1 -0
  235. package/dist/sources/registry.d.ts +19 -0
  236. package/dist/sources/registry.d.ts.map +1 -0
  237. package/dist/sources/registry.js +183 -0
  238. package/dist/sources/registry.js.map +1 -0
  239. package/dist/sources/types.d.ts +361 -0
  240. package/dist/sources/types.d.ts.map +1 -0
  241. package/dist/sources/types.js +59 -0
  242. package/dist/sources/types.js.map +1 -0
  243. package/dist/tui/index.d.ts +22 -0
  244. package/dist/tui/index.d.ts.map +1 -0
  245. package/dist/tui/index.js +711 -0
  246. package/dist/tui/index.js.map +1 -0
  247. package/dist/ui/format.d.ts +27 -0
  248. package/dist/ui/format.d.ts.map +1 -0
  249. package/dist/ui/format.js +80 -0
  250. package/dist/ui/format.js.map +1 -0
  251. package/dist/ui/help.d.ts +2 -0
  252. package/dist/ui/help.d.ts.map +1 -0
  253. package/dist/ui/help.js +106 -0
  254. package/dist/ui/help.js.map +1 -0
  255. package/dist/web/assets.d.ts +2 -0
  256. package/dist/web/assets.d.ts.map +1 -0
  257. package/dist/web/assets.js +659 -0
  258. package/dist/web/assets.js.map +1 -0
  259. package/dist/web/server.d.ts +9 -0
  260. package/dist/web/server.d.ts.map +1 -0
  261. package/dist/web/server.js +349 -0
  262. package/dist/web/server.js.map +1 -0
  263. package/package.json +105 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * hoolix secrets list <slug> — show masked credential keys
3
+ * hoolix secrets set <slug> <key> [value] — add or update a credential
4
+ * hoolix secrets remove <slug> <key> — delete a credential
5
+ *
6
+ * Credentials live in credentials.json (0600) alongside metadata.json.
7
+ * Values are never printed in full; only masked (first 6 chars … last 6).
8
+ */
9
+ import { text, password, confirm, isCancel, cancel } from '@clack/prompts';
10
+ import { getServerMetadata } from '../core/registry.js';
11
+ import { ServerNotFoundError } from '../core/errors.js';
12
+ import { logger } from '../core/logger.js';
13
+ import { loadCredentials, updateCredential, removeCredential, maskCredentials, } from '../app/services/credentials.js';
14
+ import { getTemplate } from '../app/services/catalog.js';
15
+ import { printTitle, printSection, printDetails, printCommand, printJson, ui, } from '../ui/format.js';
16
+ // ── Subcommands ───────────────────────────────────────────────────────────────
17
+ async function cmdSecretsList(slug, json) {
18
+ let meta;
19
+ try {
20
+ meta = await getServerMetadata(slug);
21
+ }
22
+ catch (e) {
23
+ const msg = e instanceof ServerNotFoundError
24
+ ? `Server "${slug}" not found. Run "hoolix list".`
25
+ : e?.message || String(e);
26
+ if (json)
27
+ printJson({ ok: false, slug, error: msg });
28
+ else
29
+ logger.error(msg);
30
+ process.exit(1);
31
+ }
32
+ if ((meta.serverKind ?? 'docs-rag') !== 'mcp-server') {
33
+ const msg = `"${slug}" is a docs-rag server. Secrets management is for mcp-server kind servers only.`;
34
+ if (json)
35
+ printJson({ ok: false, slug, error: msg });
36
+ else
37
+ logger.error(msg);
38
+ process.exit(1);
39
+ }
40
+ const credentials = await loadCredentials(slug);
41
+ const templateId = meta.definition?.template?.id;
42
+ const template = templateId
43
+ ? await getTemplate(templateId).catch(() => null)
44
+ : null;
45
+ const masked = maskCredentials(credentials, template ?? undefined);
46
+ const credKeys = meta.credentialKeys ?? Object.keys(credentials);
47
+ if (json) {
48
+ printJson({
49
+ ok: true,
50
+ slug,
51
+ templateId,
52
+ credentialKeys: credKeys,
53
+ credentials: masked,
54
+ });
55
+ return;
56
+ }
57
+ printTitle('Secrets', `${meta.name} (${slug})`);
58
+ printDetails([
59
+ ['Template', templateId ? `${template?.name ?? templateId} (${templateId})` : 'unknown'],
60
+ ['Kind', 'mcp-server'],
61
+ ]);
62
+ console.log('');
63
+ if (credKeys.length === 0) {
64
+ console.log(` ${ui.muted('No credentials stored.')}`);
65
+ console.log('');
66
+ if (template?.credentials.length) {
67
+ printSection('Expected credentials');
68
+ for (const c of template.credentials) {
69
+ const envNote = c.envVar ? ` ${ui.muted('env: ' + c.envVar)}` : '';
70
+ console.log(` ${ui.accent(c.name)}${c.required ? ' (required)' : ''} ${c.description}${envNote}`);
71
+ }
72
+ console.log('');
73
+ printCommand(`hoolix secrets set ${slug} ${template.credentials[0]?.name ?? '<key>'} <value>`);
74
+ }
75
+ return;
76
+ }
77
+ printSection('Stored credentials (values masked)');
78
+ for (const key of credKeys) {
79
+ const credDef = template?.credentials.find((c) => c.name === key);
80
+ const label = credDef?.label ?? key;
81
+ const maskedVal = masked[key] ?? ui.muted('(missing from credentials.json)');
82
+ const envNote = credDef?.envVar ? ` ${ui.muted('env: ' + credDef.envVar)}` : '';
83
+ console.log(` ${ui.muted(key.padEnd(20))} ${maskedVal} ${ui.muted(label)}${envNote}`);
84
+ }
85
+ console.log('');
86
+ printSection('Next');
87
+ printCommand(`hoolix secrets set ${slug} <key> <new-value>`);
88
+ printCommand(`hoolix connect ${slug} (regenerate client config after updating)`);
89
+ console.log('');
90
+ }
91
+ async function cmdSecretsSet(slug, key, value, json, force) {
92
+ let meta;
93
+ try {
94
+ meta = await getServerMetadata(slug);
95
+ }
96
+ catch (e) {
97
+ const msg = e instanceof ServerNotFoundError
98
+ ? `Server "${slug}" not found. Run "hoolix list".`
99
+ : e?.message || String(e);
100
+ if (json)
101
+ printJson({ ok: false, slug, error: msg });
102
+ else
103
+ logger.error(msg);
104
+ process.exit(1);
105
+ }
106
+ if ((meta.serverKind ?? 'docs-rag') !== 'mcp-server') {
107
+ const msg = `"${slug}" is a docs-rag server. Secrets management is for mcp-server kind servers only.`;
108
+ if (json)
109
+ printJson({ ok: false, slug, error: msg });
110
+ else
111
+ logger.error(msg);
112
+ process.exit(1);
113
+ }
114
+ // Resolve value: positional > interactive
115
+ let resolvedValue = value;
116
+ if (!resolvedValue) {
117
+ if (json || force) {
118
+ const msg = `Value for "${key}" is required. Pass it as the third argument or via --value <v>.`;
119
+ if (json)
120
+ printJson({ ok: false, slug, key, error: msg });
121
+ else
122
+ logger.error(msg);
123
+ process.exit(1);
124
+ }
125
+ // Interactive: masked input for sensitive credentials
126
+ const templateId = meta.definition?.template?.id;
127
+ const template = templateId ? await getTemplate(templateId).catch(() => null) : null;
128
+ const credDef = template?.credentials.find((c) => c.name === key);
129
+ const label = credDef?.label ?? key;
130
+ const hint = credDef?.validationHint ? ` (${credDef.validationHint})` : '';
131
+ const isSensitive = credDef?.sensitive !== false;
132
+ const raw = isSensitive
133
+ ? await password({ message: `New value for ${label}${hint}` })
134
+ : await text({
135
+ message: `New value for ${label}${hint}`,
136
+ placeholder: credDef?.placeholder ?? '',
137
+ validate: (v) => (v && v.trim().length > 0 ? undefined : `${label} is required`),
138
+ });
139
+ if (isCancel(raw)) {
140
+ cancel('Cancelled');
141
+ process.exit(0);
142
+ }
143
+ resolvedValue = String(raw).trim();
144
+ }
145
+ if (!resolvedValue) {
146
+ if (json)
147
+ printJson({ ok: false, slug, key, error: 'Value cannot be empty.' });
148
+ else
149
+ logger.error('Value cannot be empty.');
150
+ process.exit(1);
151
+ }
152
+ const keys = await updateCredential(slug, key, resolvedValue);
153
+ // Mask for display
154
+ const maskedDisplay = resolvedValue.length <= 12
155
+ ? `${resolvedValue.slice(0, 2)}...`
156
+ : `${resolvedValue.slice(0, 6)}...${resolvedValue.slice(-6)}`;
157
+ if (json) {
158
+ printJson({ ok: true, slug, key, credentialKeys: keys });
159
+ return;
160
+ }
161
+ console.log(` ${ui.success('✓')} Credential "${key}" updated for "${meta.name}" (${maskedDisplay})`);
162
+ console.log('');
163
+ printSection('Next');
164
+ printCommand(`hoolix connect ${slug} (regenerate client config — tokens are resolved at connect time)`);
165
+ printCommand(`hoolix client status (verify which clients are wired)`);
166
+ console.log('');
167
+ }
168
+ async function cmdSecretsRemove(slug, key, json, force) {
169
+ let meta;
170
+ try {
171
+ meta = await getServerMetadata(slug);
172
+ }
173
+ catch (e) {
174
+ const msg = e instanceof ServerNotFoundError
175
+ ? `Server "${slug}" not found.`
176
+ : e?.message || String(e);
177
+ if (json)
178
+ printJson({ ok: false, slug, error: msg });
179
+ else
180
+ logger.error(msg);
181
+ process.exit(1);
182
+ }
183
+ if ((meta.serverKind ?? 'docs-rag') !== 'mcp-server') {
184
+ const msg = `"${slug}" is a docs-rag server. Secrets management is for mcp-server kind servers only.`;
185
+ if (json)
186
+ printJson({ ok: false, slug, error: msg });
187
+ else
188
+ logger.error(msg);
189
+ process.exit(1);
190
+ }
191
+ // Confirm unless --yes
192
+ if (!force && !json) {
193
+ const ok = await confirm({ message: `Remove credential "${key}" from "${meta.name}"?` });
194
+ if (isCancel(ok) || !ok) {
195
+ cancel('Cancelled');
196
+ process.exit(0);
197
+ }
198
+ }
199
+ else if (json && !force) {
200
+ printJson({ ok: false, slug, key, error: 'Removal requires --yes with --json.' });
201
+ process.exit(1);
202
+ }
203
+ // Warn if removing a required credential
204
+ const templateId = meta.definition?.template?.id;
205
+ const template = templateId ? await getTemplate(templateId).catch(() => null) : null;
206
+ const credDef = template?.credentials.find((c) => c.name === key);
207
+ if (credDef?.required && !json) {
208
+ logger.warn(`"${key}" is a required credential for template "${templateId}". The server may not work correctly without it.`);
209
+ }
210
+ const existing = await loadCredentials(slug);
211
+ if (!(key in existing)) {
212
+ const msg = `Credential "${key}" not found in "${slug}".`;
213
+ if (json)
214
+ printJson({ ok: false, slug, key, error: msg });
215
+ else
216
+ logger.warn(msg);
217
+ return;
218
+ }
219
+ const remainingKeys = await removeCredential(slug, key);
220
+ if (json) {
221
+ printJson({ ok: true, slug, key, credentialKeys: remainingKeys });
222
+ return;
223
+ }
224
+ console.log(` ${ui.success('✓')} Credential "${key}" removed from "${meta.name}"`);
225
+ if (remainingKeys.length > 0) {
226
+ console.log(` ${ui.muted('Remaining:')} ${remainingKeys.join(', ')}`);
227
+ }
228
+ else {
229
+ console.log(` ${ui.muted('No credentials remaining.')}`);
230
+ }
231
+ console.log('');
232
+ }
233
+ // ── Dispatcher ────────────────────────────────────────────────────────────────
234
+ export async function cmdSecrets(args, json) {
235
+ // args[0] = 'secrets' | 'secret', args[1] = sub, args[2] = slug, ...
236
+ const sub = args[1];
237
+ const force = args.includes('--yes') || args.includes('-y');
238
+ if (!sub || sub === 'list' || sub === 'ls') {
239
+ // hoolix secrets list <slug> OR hoolix secrets <slug> (shorthand)
240
+ const slug = args[2] ?? sub; // allow 'hoolix secrets <slug>' as shorthand for list
241
+ if (!slug || slug === 'list' || slug === 'ls') {
242
+ if (json)
243
+ printJson({ ok: false, error: 'Usage: hoolix secrets list <slug>' });
244
+ else
245
+ logger.error('Usage: hoolix secrets list <slug>');
246
+ process.exit(1);
247
+ }
248
+ await cmdSecretsList(slug, json);
249
+ return;
250
+ }
251
+ if (sub === 'set') {
252
+ const slug = args[2];
253
+ const key = args[3];
254
+ // Value can come from positional arg or --value flag
255
+ const valueIdx = args.indexOf('--value');
256
+ const value = valueIdx !== -1 && args[valueIdx + 1]
257
+ ? args[valueIdx + 1]
258
+ : args[4];
259
+ if (!slug || !key) {
260
+ if (json)
261
+ printJson({ ok: false, error: 'Usage: hoolix secrets set <slug> <key> <value>' });
262
+ else
263
+ logger.error('Usage: hoolix secrets set <slug> <key> [value]');
264
+ process.exit(1);
265
+ }
266
+ await cmdSecretsSet(slug, key, value, json, force);
267
+ return;
268
+ }
269
+ if (sub === 'remove' || sub === 'rm' || sub === 'delete') {
270
+ const slug = args[2];
271
+ const key = args[3];
272
+ if (!slug || !key) {
273
+ if (json)
274
+ printJson({ ok: false, error: 'Usage: hoolix secrets remove <slug> <key>' });
275
+ else
276
+ logger.error('Usage: hoolix secrets remove <slug> <key>');
277
+ process.exit(1);
278
+ }
279
+ await cmdSecretsRemove(slug, key, json, force);
280
+ return;
281
+ }
282
+ // Fallback: treat first unknown arg as slug (shorthand: hoolix secrets <slug>)
283
+ if (/^[a-z0-9-]+$/.test(sub)) {
284
+ await cmdSecretsList(sub, json);
285
+ return;
286
+ }
287
+ if (json)
288
+ printJson({ ok: false, error: `Unknown secrets sub-command "${sub}". Use list, set, or remove.` });
289
+ else
290
+ logger.error(`Unknown sub-command "${sub}". Next: hoolix secrets list|set|remove <slug>`);
291
+ process.exit(1);
292
+ }
293
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EACL,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,GACpE,MAAM,iBAAiB,CAAC;AAEzB,iFAAiF;AAEjF,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,IAAa;IACvD,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,YAAY,mBAAmB;YAC1C,CAAC,CAAC,WAAW,IAAI,iCAAiC;YAClD,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,YAAY,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,IAAI,iFAAiF,CAAC;QACtG,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,UAAU;QACzB,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAa,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE3E,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC;YACR,EAAE,EAAE,IAAI;YACR,IAAI;YACJ,UAAU;YACV,cAAc,EAAE,QAAQ;YACxB,WAAW,EAAE,MAAM;SACpB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,UAAU,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;IAChD,YAAY,CAAC;QACX,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,IAAI,UAAU,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,CAAC,MAAM,EAAM,YAAY,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;YACjC,YAAY,CAAC,sBAAsB,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,GAAG,OAAO,EAAE,CAAC,CAAC;YACtG,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,YAAY,CAAC,sBAAsB,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,UAAU,CAAC,CAAC;QACjG,CAAC;QACD,OAAO;IACT,CAAC;IAED,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACnD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAK,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAK,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,YAAY,CAAC,sBAAsB,IAAI,oBAAoB,CAAC,CAAC;IAC7D,YAAY,CAAC,kBAAkB,IAAI,8CAA8C,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,GAAW,EACX,KAAyB,EACzB,IAAa,EACb,KAAc;IAEd,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,YAAY,mBAAmB;YAC1C,CAAC,CAAC,WAAW,IAAI,iCAAiC;YAClD,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,YAAY,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,IAAI,iFAAiF,CAAC;QACtG,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0CAA0C;IAC1C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,cAAc,GAAG,kEAAkE,CAAC;YAChG,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;gBACrD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,MAAM,OAAO,GAAG,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC;QACpC,MAAM,IAAI,GAAI,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,WAAW,GAAG,OAAO,EAAE,SAAS,KAAK,KAAK,CAAC;QAEjD,MAAM,GAAG,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,iBAAiB,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC;YAC9D,CAAC,CAAC,MAAM,IAAI,CAAC;gBACT,OAAO,EAAE,iBAAiB,KAAK,GAAG,IAAI,EAAE;gBACxC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE;gBACvC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC;aACjF,CAAC,CAAC;QAEP,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC5D,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;;YAC1E,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAE9D,mBAAmB;IACnB,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,IAAI,EAAE;QAC9C,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK;QACnC,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhE,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,kBAAkB,IAAI,CAAC,IAAI,MAAM,aAAa,GAAG,CAAC,CAAC;IACtG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,YAAY,CAAC,kBAAkB,IAAI,qEAAqE,CAAC,CAAC;IAC1G,YAAY,CAAC,2DAA2D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAY,EACZ,GAAW,EACX,IAAa,EACb,KAAc;IAEd,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,YAAY,mBAAmB;YAC1C,CAAC,CAAC,WAAW,IAAI,cAAc;YAC/B,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,YAAY,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,IAAI,iFAAiF,CAAC;QACtG,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,sBAAsB,GAAG,WAAW,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACzF,IAAI,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IACpE,CAAC;SAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yCAAyC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,MAAM,OAAO,GAAG,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IAClE,IAAI,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,4CAA4C,UAAU,kDAAkD,CAAC,CAAC;IAC/H,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,eAAe,GAAG,mBAAmB,IAAI,IAAI,CAAC;QAC1D,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YACrD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAExD,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,mBAAmB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACpF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,IAAa;IAC5D,qEAAqE;IACrE,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE5D,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC3C,qEAAqE;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAE,sDAAsD;QACpF,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;;gBAC1E,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,qDAAqD;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAClB,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;;gBACvF,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAClB,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;;gBAClF,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,IAAI;QAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,GAAG,8BAA8B,EAAE,CAAC,CAAC;;QACxG,MAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,gDAAgD,CAAC,CAAC;IAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdStart(args: string[], json: boolean): Promise<void>;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAOA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiP3E"}
@@ -0,0 +1,234 @@
1
+ import { getServerMetadata } from '../core/registry.js';
2
+ import { serverManager } from '../process/manager.js';
3
+ import { logger } from '../core/logger.js';
4
+ import { printTitle, printSection, printDetails, printCommand, printJson, ui, } from '../ui/format.js';
5
+ export async function cmdStart(args, json) {
6
+ const slug = args[1];
7
+ if (!slug) {
8
+ if (json)
9
+ printJson({ ok: false, error: 'Missing slug. Next: pass hoolix start <slug> [--port <n>] [--transport stdio] --json.' });
10
+ else
11
+ logger.error('Usage: hoolix start <slug> [--port <n>] [--transport stdio] [--json]');
12
+ process.exit(1);
13
+ }
14
+ // ── mcp-server kind: proxy mode or helpful redirect ──────────────────────
15
+ const metaEarly = await getServerMetadata(slug).catch(() => null);
16
+ if (metaEarly?.serverKind === 'mcp-server') {
17
+ const templateId = metaEarly.definition?.template?.id ?? 'unknown';
18
+ const isProxy = args.includes('--proxy');
19
+ if (!isProxy) {
20
+ // Default: explain stdio model and direct user to connect or --proxy
21
+ if (json) {
22
+ printJson({
23
+ ok: false,
24
+ kind: 'mcp-server',
25
+ slug,
26
+ error: `"${metaEarly.name}" uses stdio transport (${templateId}). Your MCP client spawns the process — no Hoolix host is needed.`,
27
+ next: [`hoolix connect ${slug}`, `hoolix start ${slug} --proxy (wrap behind HTTP for sharing/remote access)`],
28
+ });
29
+ }
30
+ else {
31
+ printTitle('Stdio server', `"${metaEarly.name}" (${templateId})`);
32
+ console.log(` ${ui.accent('○')} This server uses ${ui.accent('stdio transport')} — your MCP client spawns it on demand.`);
33
+ console.log(` ${ui.muted('No Hoolix host process is needed.')}`);
34
+ console.log('');
35
+ printSection('Wire it into your client');
36
+ printCommand(`hoolix connect ${slug}`);
37
+ printCommand(`hoolix connect ${slug} --client claude-code --yes`);
38
+ console.log('');
39
+ console.log(` ${ui.muted('Proxy mode:')} hoolix start ${slug} --proxy ${ui.muted('(wrap behind HTTP for sharing / remote access)')}`);
40
+ }
41
+ process.exit(0);
42
+ }
43
+ // ── Proxy mode: spawn proxy-host wrapping the stdio server ──────────────
44
+ const portIdx = args.indexOf('--port');
45
+ const port = parseInt(args[portIdx + 1] || '0', 10) || (3456 + Math.floor(Math.random() * 400));
46
+ const authKey = metaEarly.authKey;
47
+ if (!json)
48
+ printTitle('Starting proxy', `Wrapping "${metaEarly.name}" behind HTTP`);
49
+ try {
50
+ const { port: actualPort, pid } = await serverManager.startProxied(slug, { port, authKey });
51
+ if (json) {
52
+ printJson({
53
+ ok: true,
54
+ slug,
55
+ name: metaEarly.name,
56
+ transport: 'proxy',
57
+ mode: 'proxy',
58
+ url: `http://127.0.0.1:${actualPort}/mcp`,
59
+ port: actualPort,
60
+ pid,
61
+ mcpServers: {
62
+ [slug]: {
63
+ type: 'streamable-http',
64
+ url: `http://127.0.0.1:${actualPort}/mcp`,
65
+ headers: { Authorization: `Bearer ${authKey}` },
66
+ },
67
+ },
68
+ next: [`hoolix connect ${slug} --client cursor --yes`, `hoolix info ${slug}`],
69
+ });
70
+ return;
71
+ }
72
+ printTitle('Proxy running', `"${metaEarly.name}" is accessible via HTTP.`);
73
+ printDetails([
74
+ ['Mode', 'Proxy (stdio → HTTP)'],
75
+ ['Template', templateId],
76
+ ['URL', `http://127.0.0.1:${actualPort}/mcp`],
77
+ ['Auth', `Authorization: Bearer ${authKey}`],
78
+ ['PID', pid],
79
+ ]);
80
+ console.log('');
81
+ printSection('Client config (streamable-http)');
82
+ console.log(JSON.stringify({
83
+ mcpServers: {
84
+ [slug]: {
85
+ type: 'streamable-http',
86
+ url: `http://127.0.0.1:${actualPort}/mcp`,
87
+ headers: { Authorization: `Bearer ${authKey}` },
88
+ },
89
+ },
90
+ }, null, 2));
91
+ console.log('');
92
+ printSection('Next steps');
93
+ printCommand(`hoolix connect ${slug} --client cursor --yes`);
94
+ printCommand(`curl -s http://127.0.0.1:${actualPort}/health`);
95
+ console.log(` ${ui.muted('Tip:')} hoolix stop ${slug} (stops the proxy process)`);
96
+ }
97
+ catch (err) {
98
+ if (json) {
99
+ printJson({ ok: false, slug, error: err.message || String(err), next: `Run hoolix doctor --json, then retry.` });
100
+ process.exit(1);
101
+ }
102
+ logger.warn('Could not start proxy host:', err.message);
103
+ console.log('');
104
+ printSection('Fallback: wire via stdio instead');
105
+ printCommand(`hoolix connect ${slug}`);
106
+ }
107
+ return;
108
+ }
109
+ // ── stdio transport path ─────────────────────────────────────────────────
110
+ // Runs the MCP server in-process over stdin/stdout (foreground, no spawn).
111
+ // The MCP client spawns this process; stdout/stdin carry the MCP protocol.
112
+ // All human-readable output goes to stderr so it doesn't corrupt the stream.
113
+ const transportIdx = args.indexOf('--transport');
114
+ const transport = transportIdx !== -1 ? args[transportIdx + 1] : 'http';
115
+ if (transport === 'stdio') {
116
+ const meta = await getServerMetadata(slug).catch(() => null);
117
+ if (!meta) {
118
+ process.stderr.write(`hoolix error: server "${slug}" not found. Run "hoolix list".\n`);
119
+ process.exit(1);
120
+ }
121
+ // Print the client config snippet to stderr (visible when run manually;
122
+ // invisible to the MCP protocol which only reads stdout).
123
+ const clientConfig = {
124
+ mcpServers: {
125
+ [slug]: {
126
+ command: 'hoolix',
127
+ args: ['start', slug, '--transport', 'stdio'],
128
+ },
129
+ },
130
+ };
131
+ if (json) {
132
+ printJson({
133
+ ok: true,
134
+ slug,
135
+ name: meta.name,
136
+ transport: 'stdio',
137
+ ...clientConfig,
138
+ next: [`Add this config to your MCP client`, `hoolix verify ${slug} --json`],
139
+ });
140
+ return;
141
+ }
142
+ process.stderr.write(`\nhoolix › "${meta.name}" starting in stdio mode\n\n`);
143
+ process.stderr.write('Client config (paste into your MCP client):\n');
144
+ process.stderr.write(JSON.stringify(clientConfig, null, 2) + '\n\n');
145
+ process.stderr.write('Tip: hoolix connect ' + slug + ' --client claude (auto-writes the config above)\n\n');
146
+ const { startStdioServer } = await import('../mcp/stdio-host.js');
147
+ await startStdioServer(slug);
148
+ return; // startStdioServer never resolves; this is defensive
149
+ }
150
+ // ── HTTP transport path (default) ────────────────────────────────────────
151
+ const meta = await getServerMetadata(slug);
152
+ const portIdx = args.indexOf('--port');
153
+ const port = parseInt(args[portIdx + 1] || '0', 10) || (3456 + Math.floor(Math.random() * 400));
154
+ const authKey = meta.authKey;
155
+ if (!json)
156
+ printTitle('Starting', `Preparing "${meta.name}"`);
157
+ try {
158
+ const { port: actualPort, pid } = await serverManager.start(slug, { port, authKey });
159
+ if (json) {
160
+ printJson({
161
+ ok: true,
162
+ slug,
163
+ name: meta.name,
164
+ transport: 'http',
165
+ url: `http://127.0.0.1:${actualPort}/mcp`,
166
+ port: actualPort,
167
+ pid,
168
+ mcpServers: {
169
+ [slug]: {
170
+ type: 'streamable-http',
171
+ url: `http://127.0.0.1:${actualPort}/mcp`,
172
+ headers: { Authorization: `Bearer ${authKey}` },
173
+ },
174
+ },
175
+ next: [`hoolix connect ${slug} --client cursor --yes`, `hoolix verify ${slug} --json`],
176
+ });
177
+ return;
178
+ }
179
+ printTitle('Running', `"${meta.name}" is ready for MCP clients.`);
180
+ printDetails([
181
+ ['Transport', 'Streamable HTTP'],
182
+ ['URL', `http://127.0.0.1:${actualPort}/mcp`],
183
+ ['Auth', `Authorization: Bearer ${authKey}`],
184
+ ['PID', pid],
185
+ ]);
186
+ console.log('');
187
+ printSection('Streamable HTTP client config');
188
+ console.log(JSON.stringify({
189
+ mcpServers: {
190
+ [slug]: {
191
+ type: 'streamable-http',
192
+ url: `http://127.0.0.1:${actualPort}/mcp`,
193
+ headers: { Authorization: `Bearer ${authKey}` },
194
+ },
195
+ },
196
+ }, null, 2));
197
+ console.log('');
198
+ printSection('stdio client config (Claude Desktop / VS Code)');
199
+ console.log(JSON.stringify({
200
+ mcpServers: {
201
+ [slug]: {
202
+ command: 'hoolix',
203
+ args: ['start', slug, '--transport', 'stdio'],
204
+ },
205
+ },
206
+ }, null, 2));
207
+ console.log('');
208
+ printSection('Quick checks');
209
+ printCommand(`curl -s http://127.0.0.1:${actualPort}/health`);
210
+ printCommand(`curl -s -H "Authorization: Bearer ${authKey}" -X POST -d '{}' -H 'content-type: application/json' http://127.0.0.1:${actualPort}/mcp`);
211
+ console.log('');
212
+ console.log(` ${ui.muted('Tip:')} hoolix connect ${slug} --client cursor (or claude|windsurf|continue|cline|grokbuild|generic; use --project for workspace)`);
213
+ console.log(` ${ui.muted('Tip:')} hoolix start ${slug} --transport stdio (for Claude Desktop / VS Code / stdio clients)`);
214
+ }
215
+ catch (err) {
216
+ if (json) {
217
+ printJson({
218
+ ok: false,
219
+ slug,
220
+ error: err.message || String(err),
221
+ next: `Run hoolix doctor --json, then retry hoolix start ${slug} --json.`,
222
+ });
223
+ process.exit(1);
224
+ }
225
+ logger.warn('Could not automatically start the host process:', err.message);
226
+ console.log('');
227
+ printSection('Manual start options');
228
+ printCommand(`npx tsx src/mcp/host.ts --slug ${slug} --port ${port} --data-dir ".hoolix/servers/${slug}/data" --auth-key ${authKey}`);
229
+ printCommand(`hoolix start ${slug} --transport stdio`);
230
+ console.log('');
231
+ console.log(` ${ui.muted('Tip:')} hoolix connect ${slug} --client cursor`);
232
+ }
233
+ }
234
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdStats(args: string[], json: boolean): Promise<void>;
2
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAgCA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiO3E"}