@markus-global/cli 0.2.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 (177) hide show
  1. package/dist/api-client.d.ts +31 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +96 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/commands/agent.d.ts +3 -0
  6. package/dist/commands/agent.d.ts.map +1 -0
  7. package/dist/commands/agent.js +224 -0
  8. package/dist/commands/agent.js.map +1 -0
  9. package/dist/commands/approval.d.ts +3 -0
  10. package/dist/commands/approval.d.ts.map +1 -0
  11. package/dist/commands/approval.js +59 -0
  12. package/dist/commands/approval.js.map +1 -0
  13. package/dist/commands/audit.d.ts +3 -0
  14. package/dist/commands/audit.d.ts.map +1 -0
  15. package/dist/commands/audit.js +92 -0
  16. package/dist/commands/audit.js.map +1 -0
  17. package/dist/commands/builder.d.ts +3 -0
  18. package/dist/commands/builder.d.ts.map +1 -0
  19. package/dist/commands/builder.js +85 -0
  20. package/dist/commands/builder.js.map +1 -0
  21. package/dist/commands/deliverable.d.ts +3 -0
  22. package/dist/commands/deliverable.d.ts.map +1 -0
  23. package/dist/commands/deliverable.js +127 -0
  24. package/dist/commands/deliverable.js.map +1 -0
  25. package/dist/commands/external-agent.d.ts +3 -0
  26. package/dist/commands/external-agent.d.ts.map +1 -0
  27. package/dist/commands/external-agent.js +74 -0
  28. package/dist/commands/external-agent.js.map +1 -0
  29. package/dist/commands/gateway.d.ts +3 -0
  30. package/dist/commands/gateway.d.ts.map +1 -0
  31. package/dist/commands/gateway.js +155 -0
  32. package/dist/commands/gateway.js.map +1 -0
  33. package/dist/commands/init.d.ts +6 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +251 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/key.d.ts +3 -0
  38. package/dist/commands/key.d.ts.map +1 -0
  39. package/dist/commands/key.js +68 -0
  40. package/dist/commands/key.js.map +1 -0
  41. package/dist/commands/project.d.ts +3 -0
  42. package/dist/commands/project.d.ts.map +1 -0
  43. package/dist/commands/project.js +164 -0
  44. package/dist/commands/project.js.map +1 -0
  45. package/dist/commands/report.d.ts +3 -0
  46. package/dist/commands/report.d.ts.map +1 -0
  47. package/dist/commands/report.js +69 -0
  48. package/dist/commands/report.js.map +1 -0
  49. package/dist/commands/requirement.d.ts +3 -0
  50. package/dist/commands/requirement.d.ts.map +1 -0
  51. package/dist/commands/requirement.js +197 -0
  52. package/dist/commands/requirement.js.map +1 -0
  53. package/dist/commands/review.d.ts +3 -0
  54. package/dist/commands/review.d.ts.map +1 -0
  55. package/dist/commands/review.js +71 -0
  56. package/dist/commands/review.js.map +1 -0
  57. package/dist/commands/role.d.ts +3 -0
  58. package/dist/commands/role.d.ts.map +1 -0
  59. package/dist/commands/role.js +39 -0
  60. package/dist/commands/role.js.map +1 -0
  61. package/dist/commands/settings.d.ts +3 -0
  62. package/dist/commands/settings.d.ts.map +1 -0
  63. package/dist/commands/settings.js +53 -0
  64. package/dist/commands/settings.js.map +1 -0
  65. package/dist/commands/skill.d.ts +3 -0
  66. package/dist/commands/skill.d.ts.map +1 -0
  67. package/dist/commands/skill.js +136 -0
  68. package/dist/commands/skill.js.map +1 -0
  69. package/dist/commands/start.d.ts +3 -0
  70. package/dist/commands/start.d.ts.map +1 -0
  71. package/dist/commands/start.js +628 -0
  72. package/dist/commands/start.js.map +1 -0
  73. package/dist/commands/system.d.ts +3 -0
  74. package/dist/commands/system.d.ts.map +1 -0
  75. package/dist/commands/system.js +248 -0
  76. package/dist/commands/system.js.map +1 -0
  77. package/dist/commands/task.d.ts +3 -0
  78. package/dist/commands/task.d.ts.map +1 -0
  79. package/dist/commands/task.js +510 -0
  80. package/dist/commands/task.js.map +1 -0
  81. package/dist/commands/team.d.ts +3 -0
  82. package/dist/commands/team.d.ts.map +1 -0
  83. package/dist/commands/team.js +312 -0
  84. package/dist/commands/team.js.map +1 -0
  85. package/dist/commands/template.d.ts +3 -0
  86. package/dist/commands/template.d.ts.map +1 -0
  87. package/dist/commands/template.js +77 -0
  88. package/dist/commands/template.js.map +1 -0
  89. package/dist/commands/user.d.ts +3 -0
  90. package/dist/commands/user.d.ts.map +1 -0
  91. package/dist/commands/user.js +68 -0
  92. package/dist/commands/user.js.map +1 -0
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +96 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/markus.mjs +82359 -0
  98. package/dist/output.d.ts +31 -0
  99. package/dist/output.d.ts.map +1 -0
  100. package/dist/output.js +121 -0
  101. package/dist/output.js.map +1 -0
  102. package/dist/paths.d.ts +20 -0
  103. package/dist/paths.d.ts.map +1 -0
  104. package/dist/paths.js +61 -0
  105. package/dist/paths.js.map +1 -0
  106. package/dist/web-ui/assets/index-Bcc58A3R.css +1 -0
  107. package/dist/web-ui/assets/index-CP5PJ1Oz.js +61 -0
  108. package/dist/web-ui/index.html +20 -0
  109. package/dist/web-ui/logo.png +0 -0
  110. package/package.json +37 -0
  111. package/templates/openclaw-markus-skill/AGENTS.md +163 -0
  112. package/templates/openclaw-markus-skill/TOOLS.md +155 -0
  113. package/templates/openclaw-markus-skill/config.json5 +44 -0
  114. package/templates/openclaw-markus-skill/heartbeat.md +45 -0
  115. package/templates/roles/SHARED.md +383 -0
  116. package/templates/roles/agent-father/ROLE.md +42 -0
  117. package/templates/roles/content-writer/ROLE.md +28 -0
  118. package/templates/roles/developer/HEARTBEAT.md +8 -0
  119. package/templates/roles/developer/POLICIES.md +31 -0
  120. package/templates/roles/developer/ROLE.md +23 -0
  121. package/templates/roles/devops/ROLE.md +28 -0
  122. package/templates/roles/finance/ROLE.md +16 -0
  123. package/templates/roles/hr/ROLE.md +17 -0
  124. package/templates/roles/marketing/ROLE.md +16 -0
  125. package/templates/roles/openclaw-developer/openclaw.md +78 -0
  126. package/templates/roles/operations/HEARTBEAT.md +10 -0
  127. package/templates/roles/operations/ROLE.md +23 -0
  128. package/templates/roles/org-manager/HEARTBEAT.md +12 -0
  129. package/templates/roles/org-manager/POLICIES.md +14 -0
  130. package/templates/roles/org-manager/ROLE.md +102 -0
  131. package/templates/roles/product-manager/HEARTBEAT.md +9 -0
  132. package/templates/roles/product-manager/ROLE.md +37 -0
  133. package/templates/roles/project-manager/ROLE.md +44 -0
  134. package/templates/roles/qa-engineer/ROLE.md +28 -0
  135. package/templates/roles/research-assistant/ROLE.md +23 -0
  136. package/templates/roles/reviewer/HEARTBEAT.md +13 -0
  137. package/templates/roles/reviewer/ROLE.md +69 -0
  138. package/templates/roles/secretary/HEARTBEAT.md +50 -0
  139. package/templates/roles/secretary/ROLE.md +148 -0
  140. package/templates/roles/skill-architect/ROLE.md +42 -0
  141. package/templates/roles/support/ROLE.md +16 -0
  142. package/templates/roles/team-factory/ROLE.md +54 -0
  143. package/templates/roles/tech-writer/ROLE.md +23 -0
  144. package/templates/skills/agent-building/SKILL.md +140 -0
  145. package/templates/skills/agent-building/skill.json +13 -0
  146. package/templates/skills/chrome-devtools/SKILL.md +257 -0
  147. package/templates/skills/chrome-devtools/skill.json +21 -0
  148. package/templates/skills/markus-admin-cli/SKILL.md +121 -0
  149. package/templates/skills/markus-admin-cli/skill.json +14 -0
  150. package/templates/skills/markus-agent-cli/SKILL.md +67 -0
  151. package/templates/skills/markus-agent-cli/skill.json +14 -0
  152. package/templates/skills/markus-cli/SKILL.md +113 -0
  153. package/templates/skills/markus-cli/skill.json +14 -0
  154. package/templates/skills/markus-hub-connector/SKILL.md +64 -0
  155. package/templates/skills/markus-hub-connector/server.mjs +321 -0
  156. package/templates/skills/markus-hub-connector/skill.json +20 -0
  157. package/templates/skills/markus-project-cli/SKILL.md +161 -0
  158. package/templates/skills/markus-project-cli/skill.json +14 -0
  159. package/templates/skills/markus-skill-cli/SKILL.md +57 -0
  160. package/templates/skills/markus-skill-cli/skill.json +14 -0
  161. package/templates/skills/markus-team-cli/SKILL.md +52 -0
  162. package/templates/skills/markus-team-cli/skill.json +14 -0
  163. package/templates/skills/self-evolution/SKILL.md +207 -0
  164. package/templates/skills/self-evolution/skill.json +14 -0
  165. package/templates/skills/skill-building/SKILL.md +172 -0
  166. package/templates/skills/skill-building/skill.json +13 -0
  167. package/templates/skills/team-building/SKILL.md +159 -0
  168. package/templates/skills/team-building/skill.json +13 -0
  169. package/templates/teams/content-team/ANNOUNCEMENT.md +10 -0
  170. package/templates/teams/content-team/NORMS.md +20 -0
  171. package/templates/teams/content-team/team.json +18 -0
  172. package/templates/teams/dev-squad/ANNOUNCEMENT.md +11 -0
  173. package/templates/teams/dev-squad/NORMS.md +22 -0
  174. package/templates/teams/dev-squad/team.json +19 -0
  175. package/templates/teams/startup-team/ANNOUNCEMENT.md +11 -0
  176. package/templates/teams/startup-team/NORMS.md +21 -0
  177. package/templates/teams/startup-team/team.json +20 -0
@@ -0,0 +1,251 @@
1
+ import { resolve } from 'node:path';
2
+ import { readFileSync, existsSync, cpSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { saveConfig, getDefaultConfigPath, APP_VERSION } from '@markus/shared';
5
+ import { resolveTemplatesDir } from '../paths.js';
6
+ export function registerInitCommand(program) {
7
+ program
8
+ .command('init')
9
+ .description('Interactive setup wizard: configure LLM provider, API keys, and server settings')
10
+ .option('--force', 'Overwrite existing configuration')
11
+ .action(async (opts) => {
12
+ await quickInit({ force: opts.force });
13
+ });
14
+ }
15
+ export async function quickInit(options) {
16
+ const { writeFileSync, mkdirSync } = await import('node:fs');
17
+ const { join: pathJoin } = await import('node:path');
18
+ const readline = await import('node:readline');
19
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
20
+ const ask = (q, def) => new Promise(r => rl.question(`${q}${def ? ` [${def}]` : ''}: `, ans => r(ans.trim() || def || '')));
21
+ // Welcome banner
22
+ console.log(`
23
+ ┌─────────────────────────────────────┐
24
+ │ Markus v${APP_VERSION.padEnd(22)}│
25
+ │ AI Digital Workforce Platform │
26
+ └─────────────────────────────────────┘
27
+ `);
28
+ // Check for existing config
29
+ const configPath = getDefaultConfigPath();
30
+ if (existsSync(configPath) && !options?.force) {
31
+ console.log(` Existing configuration found: ${configPath}`);
32
+ const overwrite = await ask(' Overwrite? (y/n)', 'n');
33
+ if (overwrite.toLowerCase() !== 'y') {
34
+ console.log(' Keeping existing config. Use --force to overwrite.');
35
+ rl.close();
36
+ return;
37
+ }
38
+ console.log('');
39
+ }
40
+ const MODEL_MAP = {
41
+ anthropic: 'claude-opus-4-6',
42
+ openai: 'gpt-5.4',
43
+ google: 'gemini-3-1-pro',
44
+ minimax: 'MiniMax-M2.7',
45
+ siliconflow: 'Qwen/Qwen3.5-35B-A3B',
46
+ ollama: 'llama3',
47
+ openrouter: 'xiaomi/mimo-v2-pro',
48
+ };
49
+ const ENV_KEY_MAP = [
50
+ { provider: 'anthropic', label: 'Anthropic', envKey: 'ANTHROPIC_API_KEY' },
51
+ { provider: 'openai', label: 'OpenAI', envKey: 'OPENAI_API_KEY' },
52
+ { provider: 'google', label: 'Google Gemini', envKey: 'GOOGLE_API_KEY' },
53
+ { provider: 'siliconflow', label: 'SiliconFlow', envKey: 'SILICONFLOW_API_KEY', baseUrl: 'https://api.siliconflow.cn/v1' },
54
+ { provider: 'minimax', label: 'MiniMax', envKey: 'MINIMAX_API_KEY', baseUrl: 'https://api.minimax.io/v1' },
55
+ { provider: 'openrouter', label: 'OpenRouter', envKey: 'OPENROUTER_API_KEY', baseUrl: 'https://openrouter.ai/api/v1' },
56
+ ];
57
+ console.log(' [1/3] LLM Provider Configuration\n');
58
+ // --- Step 1: Auto-detect available sources ---
59
+ const envProviders = [];
60
+ for (const def of ENV_KEY_MAP) {
61
+ const key = process.env[def.envKey];
62
+ if (key)
63
+ envProviders.push({ provider: def.provider, label: def.label, key, baseUrl: def.baseUrl });
64
+ }
65
+ let openclawPath = '';
66
+ const openclawCandidates = [
67
+ pathJoin(homedir(), '.openclaw', 'openclaw.json'),
68
+ pathJoin(homedir(), '.openclaw', 'openclaw.json5'),
69
+ ];
70
+ for (const p of openclawCandidates) {
71
+ if (existsSync(p)) {
72
+ openclawPath = p;
73
+ break;
74
+ }
75
+ }
76
+ // --- Step 2: Show detected sources and let user choose ---
77
+ const sources = [];
78
+ if (envProviders.length > 0) {
79
+ console.log(` Found ${envProviders.length} API key(s) in environment variables:`);
80
+ for (const ep of envProviders)
81
+ console.log(` - ${ep.label} (${ep.provider})`);
82
+ sources.push('env');
83
+ }
84
+ if (openclawPath) {
85
+ console.log(` Found OpenClaw config: ${openclawPath}`);
86
+ sources.push('openclaw');
87
+ }
88
+ if (sources.length === 0) {
89
+ console.log(' No API keys detected in environment or OpenClaw config.');
90
+ }
91
+ console.log('');
92
+ let mode;
93
+ if (sources.length > 0) {
94
+ const options = [
95
+ ...sources.map(s => s === 'env' ? 'env (use environment variables)' : 'openclaw (import from OpenClaw)'),
96
+ 'manual (enter API key manually)',
97
+ ];
98
+ mode = await ask(` Config source? ${options.join(' / ')}`, sources[0]);
99
+ if (!['env', 'openclaw', 'manual'].includes(mode))
100
+ mode = sources[0];
101
+ }
102
+ else {
103
+ mode = 'manual';
104
+ }
105
+ // --- Step 3: Build provider configs based on chosen source ---
106
+ const providers = {};
107
+ let defaultProvider = '';
108
+ if (mode === 'env') {
109
+ for (const ep of envProviders) {
110
+ const model = process.env[`${ep.provider.toUpperCase()}_MODEL`] ?? MODEL_MAP[ep.provider] ?? '';
111
+ providers[ep.provider] = {
112
+ apiKey: ep.key,
113
+ model,
114
+ ...(ep.baseUrl ? { baseUrl: ep.baseUrl } : {}),
115
+ enabled: true,
116
+ };
117
+ }
118
+ defaultProvider = envProviders[0].provider;
119
+ console.log(`\n Importing ${envProviders.length} provider(s) from environment variables.`);
120
+ if (envProviders.length > 1) {
121
+ const choices = envProviders.map(e => e.provider).join('/');
122
+ defaultProvider = await ask(` Default provider? (${choices})`, defaultProvider);
123
+ if (!providers[defaultProvider])
124
+ defaultProvider = envProviders[0].provider;
125
+ }
126
+ }
127
+ else if (mode === 'openclaw') {
128
+ try {
129
+ const raw = readFileSync(openclawPath, 'utf-8');
130
+ const cleaned = raw
131
+ .replace(/\/\/.*$/gm, '')
132
+ .replace(/\/\*[\s\S]*?\*\//g, '')
133
+ .replace(/,\s*([\]}])/g, '$1');
134
+ const parsed = JSON.parse(cleaned);
135
+ const modelsSection = parsed.models;
136
+ if (modelsSection?.providers) {
137
+ const provNames = Object.keys(modelsSection.providers);
138
+ console.log(`\n Found ${provNames.length} provider(s) in OpenClaw config.`);
139
+ for (const [name, cfg] of Object.entries(modelsSection.providers)) {
140
+ providers[name] = {
141
+ ...(cfg.baseUrl ? { baseUrl: cfg.baseUrl } : {}),
142
+ model: cfg.models?.[0]?.id,
143
+ enabled: true,
144
+ };
145
+ }
146
+ if (provNames.length > 0)
147
+ defaultProvider = provNames[0];
148
+ if (provNames.length > 1) {
149
+ defaultProvider = await ask(` Default provider? (${provNames.join('/')})`, defaultProvider);
150
+ if (!providers[defaultProvider])
151
+ defaultProvider = provNames[0];
152
+ }
153
+ }
154
+ else {
155
+ console.log('\n No model providers found in OpenClaw config, switching to manual mode.');
156
+ mode = 'manual';
157
+ }
158
+ }
159
+ catch (e) {
160
+ console.log(`\n Failed to parse OpenClaw config: ${e}\n Switching to manual mode.`);
161
+ mode = 'manual';
162
+ }
163
+ }
164
+ if (mode === 'manual') {
165
+ const provider = await ask(' LLM provider (anthropic/openai/google/minimax/siliconflow/ollama)', 'anthropic');
166
+ defaultProvider = provider;
167
+ let apiKey = '';
168
+ if (provider !== 'ollama') {
169
+ apiKey = await ask(` ${provider} API Key`) ?? '';
170
+ }
171
+ if (apiKey || provider === 'ollama') {
172
+ const baseUrlMap = {
173
+ minimax: 'https://api.minimax.io/v1',
174
+ siliconflow: 'https://api.siliconflow.cn/v1',
175
+ };
176
+ providers[provider] = {
177
+ ...(apiKey ? { apiKey } : {}),
178
+ model: MODEL_MAP[provider],
179
+ ...(baseUrlMap[provider] ? { baseUrl: baseUrlMap[provider] } : {}),
180
+ enabled: true,
181
+ };
182
+ }
183
+ }
184
+ // --- Step 4: Server settings ---
185
+ console.log('\n [2/3] Server Settings\n');
186
+ const port = await ask(' API Port', '8056');
187
+ rl.close();
188
+ // --- Step 5: Save config ---
189
+ console.log('\n [3/3] Saving Configuration\n');
190
+ const configUpdates = {
191
+ llm: {
192
+ defaultProvider,
193
+ defaultModel: MODEL_MAP[defaultProvider] ?? MODEL_MAP.anthropic,
194
+ providers,
195
+ },
196
+ server: { apiPort: parseInt(port), webPort: parseInt(port) + 1 },
197
+ };
198
+ try {
199
+ saveConfig(configUpdates);
200
+ console.log(` Config saved to ${configPath}`);
201
+ if (Object.keys(providers).length > 0) {
202
+ console.log(` Providers: ${Object.keys(providers).join(', ')} (default: ${defaultProvider})`);
203
+ }
204
+ }
205
+ catch (e) {
206
+ console.error(`\n Failed to save config: ${e}`);
207
+ }
208
+ // Seed user-local templates from the built-in package templates
209
+ const userTemplatesDir = pathJoin(homedir(), '.markus', 'templates');
210
+ const builtinTemplatesDir = resolveTemplatesDir('roles');
211
+ if (builtinTemplatesDir && existsSync(builtinTemplatesDir) && !existsSync(userTemplatesDir)) {
212
+ const builtinRoot = resolve(builtinTemplatesDir, '..');
213
+ mkdirSync(userTemplatesDir, { recursive: true });
214
+ cpSync(builtinRoot, userTemplatesDir, { recursive: true });
215
+ console.log(` Copied templates to ${userTemplatesDir}`);
216
+ }
217
+ // Ensure a default developer role exists
218
+ const devRoleDir = pathJoin(userTemplatesDir || pathJoin(process.cwd(), 'templates'), 'roles', 'developer');
219
+ if (!existsSync(devRoleDir)) {
220
+ mkdirSync(devRoleDir, { recursive: true });
221
+ writeFileSync(pathJoin(devRoleDir, 'ROLE.md'), [
222
+ '---',
223
+ 'name: Developer',
224
+ 'description: Full-stack software developer',
225
+ 'heartbeatInterval: 600000',
226
+ '---',
227
+ '',
228
+ 'You are a skilled software developer. You write clean, maintainable code and follow best practices.',
229
+ 'You can read and edit files, run shell commands, search the web, and collaborate with other agents.',
230
+ '',
231
+ ].join('\n'));
232
+ console.log(' Created default developer role template.');
233
+ }
234
+ const apiPort = parseInt(port) || 8056;
235
+ console.log(`
236
+ ┌─────────────────────────────────────┐
237
+ │ Setup Complete! │
238
+ └─────────────────────────────────────┘
239
+
240
+ Next steps:
241
+
242
+ markus start Start the server
243
+ markus agent list List agents
244
+ markus --help Show all commands
245
+
246
+ Config: ${configPath}
247
+ Data: ${pathJoin(homedir(), '.markus')}
248
+ Server: http://localhost:${apiPort}
249
+ `);
250
+ }
251
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAc,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iFAAiF,CAAC;SAC9F,MAAM,CAAC,SAAS,EAAE,kCAAkC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA6B;IAC3D,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,GAAY,EAAmB,EAAE,CACvD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CACd,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAClF,CAAC;IAEJ,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC;;sBAEQ,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;;;GAGzC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAA2B;QACxC,SAAS,EAAE,iBAAiB;QAC5B,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,sBAAsB;QACnC,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,oBAAoB;KACjC,CAAC;IAEF,MAAM,WAAW,GAAiF;QAChG,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE;QAC1E,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE;QACjE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE;QACxE,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,+BAA+B,EAAE;QAC1H,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,2BAA2B,EAAE;QAC1G,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,8BAA8B,EAAE;KACvH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,gDAAgD;IAChD,MAAM,YAAY,GAA8E,EAAE,CAAC;IACnG,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,GAAG;YAAE,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,MAAM,kBAAkB,GAAG;QACzB,QAAQ,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC;QACjD,QAAQ,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,gBAAgB,CAAC;KACnD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,YAAY,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IACjD,CAAC;IAED,4DAA4D;IAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,MAAM,uCAAuC,CAAC,CAAC;QACnF,KAAK,MAAM,EAAE,IAAI,YAAY;YAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG;YACd,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,iCAAiC,CAAC;YACxG,iCAAiC;SAClC,CAAC;QACF,IAAI,GAAG,MAAM,GAAG,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,QAAQ,CAAC;IAClB,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GAA6F,EAAE,CAAC;IAC/G,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChG,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG;gBACvB,MAAM,EAAE,EAAE,CAAC,GAAG;gBACd,KAAK;gBACL,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,YAAY,CAAC,MAAM,0CAA0C,CAAC,CAAC;QAC5F,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,eAAe,GAAG,MAAM,GAAG,CAAC,wBAAwB,OAAO,GAAG,EAAE,eAAe,CAAC,CAAC;YACjF,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;gBAAE,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9E,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,GAAG;iBAChB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;iBACxB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;iBAChC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAwH,CAAC;YACtJ,IAAI,aAAa,EAAE,SAAS,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,MAAM,kCAAkC,CAAC,CAAC;gBAC7E,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClE,SAAS,CAAC,IAAI,CAAC,GAAG;wBAChB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC1B,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACzD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,eAAe,GAAG,MAAM,GAAG,CAAC,wBAAwB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;oBAC7F,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;wBAAE,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;gBAC1F,IAAI,GAAG,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,+BAA+B,CAAC,CAAC;YACtF,IAAI,GAAG,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,qEAAqE,EAAE,WAAW,CAAC,CAAC;QAC/G,eAAe,GAAG,QAAQ,CAAC;QAC3B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,UAAU,GAA2B;gBACzC,OAAO,EAAE,2BAA2B;gBACpC,WAAW,EAAE,+BAA+B;aAC7C,CAAC;YACF,SAAS,CAAC,QAAQ,CAAC,GAAG;gBACpB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC;gBAC1B,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,8BAA8B;IAC9B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,aAAa,GAA4B;QAC7C,GAAG,EAAE;YACH,eAAe;YACf,YAAY,EAAE,SAAS,CAAC,eAAe,CAAC,IAAI,SAAS,CAAC,SAAS;YAC/D,SAAS;SACV;QACD,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;KACjE,CAAC;IAEF,IAAI,CAAC;QACH,UAAU,CAAC,aAAoB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,eAAe,GAAG,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,gEAAgE;IAChE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,mBAAmB,IAAI,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5F,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACvD,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,gBAAgB,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,yCAAyC;IACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5G,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,aAAa,CACX,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAC/B;YACE,KAAK;YACL,iBAAiB;YACjB,4CAA4C;YAC5C,2BAA2B;YAC3B,KAAK;YACL,EAAE;YACF,qGAAqG;YACrG,qGAAqG;YACrG,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;aAWD,UAAU;aACV,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC;8BACb,OAAO;GAClC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerKeyCommands(program: Command): void;
3
+ //# sourceMappingURL=key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/commands/key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA4DnD"}
@@ -0,0 +1,68 @@
1
+ import { createClient, ApiError } from '../api-client.js';
2
+ import { table, success, fail, extractRows } from '../output.js';
3
+ export function registerKeyCommands(program) {
4
+ const root = program.command('key').description('API keys');
5
+ root
6
+ .command('list')
7
+ .option('--org-id <id>')
8
+ .action(async (opts, cmd) => {
9
+ const g = cmd.optsWithGlobals();
10
+ const client = createClient(g);
11
+ const out = { json: !!g.json };
12
+ try {
13
+ const data = await client.get('/keys', opts.orgId ? { orgId: opts.orgId } : undefined);
14
+ const rows = extractRows(data);
15
+ table(rows, [
16
+ { key: 'id', header: 'ID', width: 28 },
17
+ { key: 'name', header: 'Name', width: 20 },
18
+ { key: 'createdAt', header: 'Created', width: 24 },
19
+ ], { ...out, title: 'Keys' });
20
+ }
21
+ catch (e) {
22
+ if (e instanceof ApiError)
23
+ fail(e.message);
24
+ throw e;
25
+ }
26
+ });
27
+ root
28
+ .command('create')
29
+ .option('--name <n>')
30
+ .option('--org-id <id>')
31
+ .action(async (opts, cmd) => {
32
+ const g = cmd.optsWithGlobals();
33
+ const client = createClient(g);
34
+ const out = { json: !!g.json };
35
+ try {
36
+ const data = await client.post('/keys', {
37
+ ...(opts.name && { name: opts.name }),
38
+ ...(opts.orgId && { orgId: opts.orgId }),
39
+ });
40
+ success('API key created', data, out);
41
+ if (!out.json && data) {
42
+ const t = data['token'] ?? data['key'] ?? data['apiKey'];
43
+ if (t)
44
+ console.log(`Token: ${t}`);
45
+ }
46
+ }
47
+ catch (e) {
48
+ if (e instanceof ApiError)
49
+ fail(e.message);
50
+ throw e;
51
+ }
52
+ });
53
+ root.command('delete <id>').action(async (id, _opts, cmd) => {
54
+ const g = cmd.optsWithGlobals();
55
+ const client = createClient(g);
56
+ const out = { json: !!g.json };
57
+ try {
58
+ const data = await client.delete(`/keys/${encodeURIComponent(id)}`);
59
+ success('Key deleted', data, out);
60
+ }
61
+ catch (e) {
62
+ if (e instanceof ApiError)
63
+ fail(e.message);
64
+ throw e;
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/commands/key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerProjectCommands(program: Command): Command;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAgJjE"}
@@ -0,0 +1,164 @@
1
+ import { ApiError, createClient } from '../api-client.js';
2
+ import { detail, fail, success, table } from '../output.js';
3
+ function outOpts(cmd) {
4
+ const g = cmd.optsWithGlobals();
5
+ return { json: !!g.json };
6
+ }
7
+ function truncate(s, max) {
8
+ if (s.length <= max)
9
+ return s;
10
+ return s.slice(0, max - 1) + '…';
11
+ }
12
+ function parseRepositories(raw) {
13
+ if (!raw?.trim())
14
+ return undefined;
15
+ try {
16
+ const parsed = JSON.parse(raw);
17
+ return Array.isArray(parsed) ? parsed : undefined;
18
+ }
19
+ catch {
20
+ fail('Invalid JSON for --repositories (expected a JSON array)');
21
+ }
22
+ }
23
+ function parseTeamIds(raw) {
24
+ if (!raw?.trim())
25
+ return undefined;
26
+ const ids = raw.split(',').map(s => s.trim()).filter(Boolean);
27
+ return ids.length ? ids : undefined;
28
+ }
29
+ export function registerProjectCommands(program) {
30
+ const project = program.command('project').description('Manage projects');
31
+ project
32
+ .command('list')
33
+ .description('List projects')
34
+ .option('--org-id <id>', 'Organization id')
35
+ .action(async (_opts, cmd) => {
36
+ const globalOpts = cmd.optsWithGlobals();
37
+ const client = createClient(globalOpts);
38
+ const opts = { json: !!globalOpts.json };
39
+ try {
40
+ const res = await client.get('/projects', {
41
+ orgId: globalOpts.orgId,
42
+ });
43
+ const projects = res.projects ?? [];
44
+ if (opts.json) {
45
+ console.log(JSON.stringify(projects, null, 2));
46
+ return;
47
+ }
48
+ table(projects, [
49
+ { key: 'id', header: 'id', width: 30 },
50
+ { key: 'name', header: 'name', width: 20 },
51
+ { key: 'status', header: 'status', width: 8 },
52
+ { key: 'description', header: 'description', width: 30 },
53
+ ], { title: 'Projects' });
54
+ }
55
+ catch (e) {
56
+ if (e instanceof ApiError)
57
+ fail(e.message);
58
+ throw e;
59
+ }
60
+ });
61
+ project
62
+ .command('get <id>')
63
+ .description('Get a project by id')
64
+ .action(async (id, _opts, cmd) => {
65
+ const globalOpts = cmd.optsWithGlobals();
66
+ const client = createClient(globalOpts);
67
+ const opts = outOpts(cmd);
68
+ try {
69
+ const res = await client.get(`/projects/${encodeURIComponent(id)}`);
70
+ detail(res.project ?? {}, { ...opts, title: `Project ${id}` });
71
+ }
72
+ catch (e) {
73
+ if (e instanceof ApiError)
74
+ fail(e.message);
75
+ throw e;
76
+ }
77
+ });
78
+ project
79
+ .command('create')
80
+ .description('Create a project')
81
+ .requiredOption('--name <name>', 'Project name')
82
+ .option('--description <text>', 'Description')
83
+ .option('--org-id <id>', 'Organization id')
84
+ .option('--repositories <json>', 'JSON array of repository objects')
85
+ .option('--team-ids <ids>', 'Comma-separated team ids')
86
+ .action(async (_opts, cmd) => {
87
+ const globalOpts = cmd.optsWithGlobals();
88
+ const client = createClient(globalOpts);
89
+ const opts = outOpts(cmd);
90
+ const repositories = parseRepositories(globalOpts.repositories);
91
+ const teamIds = parseTeamIds(globalOpts.teamIds);
92
+ const body = {
93
+ name: globalOpts.name,
94
+ description: globalOpts.description ?? '',
95
+ orgId: globalOpts.orgId ?? 'default',
96
+ };
97
+ if (repositories !== undefined)
98
+ body['repositories'] = repositories;
99
+ if (teamIds !== undefined)
100
+ body['teamIds'] = teamIds;
101
+ try {
102
+ const res = await client.post('/projects', body);
103
+ success('Project created', res.project, opts);
104
+ }
105
+ catch (e) {
106
+ if (e instanceof ApiError)
107
+ fail(e.message);
108
+ throw e;
109
+ }
110
+ });
111
+ project
112
+ .command('update <id>')
113
+ .description('Update a project')
114
+ .option('--name <name>', 'Project name')
115
+ .option('--description <text>', 'Description')
116
+ .option('--repositories <json>', 'JSON array of repository objects')
117
+ .option('--team-ids <ids>', 'Comma-separated team ids')
118
+ .action(async (id, _opts, cmd) => {
119
+ const globalOpts = cmd.optsWithGlobals();
120
+ const client = createClient(globalOpts);
121
+ const opts = outOpts(cmd);
122
+ const body = {};
123
+ if (globalOpts.name !== undefined)
124
+ body['name'] = globalOpts.name;
125
+ if (globalOpts.description !== undefined)
126
+ body['description'] = globalOpts.description;
127
+ const repositories = parseRepositories(globalOpts.repositories);
128
+ const teamIds = parseTeamIds(globalOpts.teamIds);
129
+ if (repositories !== undefined)
130
+ body['repositories'] = repositories;
131
+ if (teamIds !== undefined)
132
+ body['teamIds'] = teamIds;
133
+ if (Object.keys(body).length === 0)
134
+ fail('Provide at least one of --name, --description, --repositories, --team-ids');
135
+ try {
136
+ const res = await client.put(`/projects/${encodeURIComponent(id)}`, body);
137
+ success('Project updated', res.project, opts);
138
+ }
139
+ catch (e) {
140
+ if (e instanceof ApiError)
141
+ fail(e.message);
142
+ throw e;
143
+ }
144
+ });
145
+ project
146
+ .command('delete <id>')
147
+ .description('Delete a project')
148
+ .action(async (id, _opts, cmd) => {
149
+ const globalOpts = cmd.optsWithGlobals();
150
+ const client = createClient(globalOpts);
151
+ const opts = outOpts(cmd);
152
+ try {
153
+ const res = await client.delete(`/projects/${encodeURIComponent(id)}`);
154
+ success('Project deleted', res, opts);
155
+ }
156
+ catch (e) {
157
+ if (e instanceof ApiError)
158
+ fail(e.message);
159
+ throw e;
160
+ }
161
+ });
162
+ return project;
163
+ }
164
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerReportCommands(program: Command): void;
3
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QA8DtD"}
@@ -0,0 +1,69 @@
1
+ import { createClient, ApiError } from '../api-client.js';
2
+ import { table, detail, success, fail, extractRows } from '../output.js';
3
+ export function registerReportCommands(program) {
4
+ const root = program.command('report').description('Reports and usage');
5
+ root
6
+ .command('generate')
7
+ .requiredOption('--period <p>', 'daily | weekly | monthly')
8
+ .option('--scope <s>')
9
+ .option('--org-id <id>')
10
+ .action(async (opts, cmd) => {
11
+ const g = cmd.optsWithGlobals();
12
+ const client = createClient(g);
13
+ const out = { json: !!g.json };
14
+ const period = String(opts.period).toLowerCase();
15
+ if (!['daily', 'weekly', 'monthly'].includes(period))
16
+ fail('--period must be daily, weekly, or monthly');
17
+ try {
18
+ const data = await client.post('/reports/generate', {
19
+ period,
20
+ ...(opts.scope && { scope: opts.scope }),
21
+ ...(opts.orgId && { orgId: opts.orgId }),
22
+ });
23
+ success('Report generated', data, out);
24
+ }
25
+ catch (e) {
26
+ if (e instanceof ApiError)
27
+ fail(e.message);
28
+ throw e;
29
+ }
30
+ });
31
+ root
32
+ .command('usage')
33
+ .option('--org-id <id>')
34
+ .action(async (opts, cmd) => {
35
+ const g = cmd.optsWithGlobals();
36
+ const client = createClient(g);
37
+ const out = { json: !!g.json };
38
+ const q = opts.orgId ? { orgId: opts.orgId } : undefined;
39
+ try {
40
+ const usage = await client.get('/usage', q);
41
+ const agentsData = await client.get('/usage/agents', q);
42
+ if (out.json) {
43
+ console.log(JSON.stringify({ usage, agents: agentsData }, null, 2));
44
+ return;
45
+ }
46
+ const u = (usage.usage ?? usage);
47
+ detail(u, { title: 'Usage' });
48
+ if (usage.plan) {
49
+ const plan = usage.plan;
50
+ const limits = (plan.limits ?? plan);
51
+ detail({ tier: plan.tier, ...limits }, { title: 'Plan limits' });
52
+ }
53
+ const agentRows = extractRows(agentsData);
54
+ table(agentRows, [
55
+ { key: 'agentName', header: 'Name', width: 20 },
56
+ { key: 'role', header: 'Role', width: 18 },
57
+ { key: 'status', header: 'Status', width: 8 },
58
+ { key: 'tokensUsedToday', header: 'Tokens/Day', width: 12 },
59
+ { key: 'totalTokensUsed', header: 'Total Tokens', width: 14 },
60
+ ], { title: 'Usage by agent' });
61
+ }
62
+ catch (e) {
63
+ if (e instanceof ApiError)
64
+ fail(e.message);
65
+ throw e;
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerRequirementCommands(program: Command): void;
3
+ //# sourceMappingURL=requirement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement.d.ts","sourceRoot":"","sources":["../../src/commands/requirement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,QA8M3D"}