@l4yercak3/cli 1.3.1 → 2.0.0-alpha.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.
- package/README.md +10 -220
- package/dist/api/client.d.ts +12 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +37 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/platform.d.ts +161 -0
- package/dist/api/platform.d.ts.map +1 -0
- package/dist/api/platform.js +70 -0
- package/dist/api/platform.js.map +1 -0
- package/dist/bin/sevenlayers.d.ts +3 -0
- package/dist/bin/sevenlayers.d.ts.map +1 -0
- package/dist/bin/sevenlayers.js +198 -0
- package/dist/bin/sevenlayers.js.map +1 -0
- package/dist/commands/agent/catalog.d.ts +5 -0
- package/dist/commands/agent/catalog.d.ts.map +1 -0
- package/dist/commands/agent/catalog.js +142 -0
- package/dist/commands/agent/catalog.js.map +1 -0
- package/dist/commands/agent/drift.d.ts +5 -0
- package/dist/commands/agent/drift.d.ts.map +1 -0
- package/dist/commands/agent/drift.js +113 -0
- package/dist/commands/agent/drift.js.map +1 -0
- package/dist/commands/agent/init.d.ts +5 -0
- package/dist/commands/agent/init.d.ts.map +1 -0
- package/dist/commands/agent/init.js +75 -0
- package/dist/commands/agent/init.js.map +1 -0
- package/dist/commands/agent/permissions.d.ts +5 -0
- package/dist/commands/agent/permissions.d.ts.map +1 -0
- package/dist/commands/agent/permissions.js +88 -0
- package/dist/commands/agent/permissions.js.map +1 -0
- package/dist/commands/agent/runner.d.ts +14 -0
- package/dist/commands/agent/runner.d.ts.map +1 -0
- package/dist/commands/agent/runner.js +59 -0
- package/dist/commands/agent/runner.js.map +1 -0
- package/dist/commands/agent/shared.d.ts +13 -0
- package/dist/commands/agent/shared.d.ts.map +1 -0
- package/dist/commands/agent/shared.js +31 -0
- package/dist/commands/agent/shared.js.map +1 -0
- package/dist/commands/agent/template.d.ts +5 -0
- package/dist/commands/agent/template.d.ts.map +1 -0
- package/dist/commands/agent/template.js +104 -0
- package/dist/commands/agent/template.js.map +1 -0
- package/dist/commands/app/connect.d.ts +7 -0
- package/dist/commands/app/connect.d.ts.map +1 -0
- package/dist/commands/app/connect.js +12 -0
- package/dist/commands/app/connect.js.map +1 -0
- package/dist/commands/app/init.d.ts +7 -0
- package/dist/commands/app/init.d.ts.map +1 -0
- package/dist/commands/app/init.js +12 -0
- package/dist/commands/app/init.js.map +1 -0
- package/dist/commands/app/link.d.ts +3 -0
- package/dist/commands/app/link.d.ts.map +1 -0
- package/dist/commands/app/link.js +92 -0
- package/dist/commands/app/link.js.map +1 -0
- package/dist/commands/app/pages.d.ts +15 -0
- package/dist/commands/app/pages.d.ts.map +1 -0
- package/dist/commands/app/pages.js +180 -0
- package/dist/commands/app/pages.js.map +1 -0
- package/dist/commands/app/register.d.ts +3 -0
- package/dist/commands/app/register.d.ts.map +1 -0
- package/dist/commands/app/register.js +120 -0
- package/dist/commands/app/register.js.map +1 -0
- package/dist/commands/app/remote.d.ts +14 -0
- package/dist/commands/app/remote.d.ts.map +1 -0
- package/dist/commands/app/remote.js +44 -0
- package/dist/commands/app/remote.js.map +1 -0
- package/dist/commands/app/setup.d.ts +3 -0
- package/dist/commands/app/setup.d.ts.map +1 -0
- package/dist/commands/app/setup.js +299 -0
- package/dist/commands/app/setup.js.map +1 -0
- package/dist/commands/app/shared.d.ts +9 -0
- package/dist/commands/app/shared.d.ts.map +1 -0
- package/dist/commands/app/shared.js +122 -0
- package/dist/commands/app/shared.js.map +1 -0
- package/dist/commands/app/sync.d.ts +7 -0
- package/dist/commands/app/sync.d.ts.map +1 -0
- package/dist/commands/app/sync.js +107 -0
- package/dist/commands/app/sync.js.map +1 -0
- package/dist/commands/booking/check.d.ts +3 -0
- package/dist/commands/booking/check.d.ts.map +1 -0
- package/dist/commands/booking/check.js +68 -0
- package/dist/commands/booking/check.js.map +1 -0
- package/dist/commands/booking/setup.d.ts +3 -0
- package/dist/commands/booking/setup.d.ts.map +1 -0
- package/dist/commands/booking/setup.js +95 -0
- package/dist/commands/booking/setup.js.map +1 -0
- package/dist/commands/booking/shared.d.ts +31 -0
- package/dist/commands/booking/shared.d.ts.map +1 -0
- package/dist/commands/booking/shared.js +112 -0
- package/dist/commands/booking/shared.js.map +1 -0
- package/dist/commands/booking/smoke.d.ts +3 -0
- package/dist/commands/booking/smoke.d.ts.map +1 -0
- package/dist/commands/booking/smoke.js +101 -0
- package/dist/commands/booking/smoke.js.map +1 -0
- package/dist/commands/cms/bind.d.ts +3 -0
- package/dist/commands/cms/bind.d.ts.map +1 -0
- package/dist/commands/cms/bind.js +212 -0
- package/dist/commands/cms/bind.js.map +1 -0
- package/dist/commands/cms/content.d.ts +40 -0
- package/dist/commands/cms/content.d.ts.map +1 -0
- package/dist/commands/cms/content.js +169 -0
- package/dist/commands/cms/content.js.map +1 -0
- package/dist/commands/cms/doctor.d.ts +3 -0
- package/dist/commands/cms/doctor.d.ts.map +1 -0
- package/dist/commands/cms/doctor.js +69 -0
- package/dist/commands/cms/doctor.js.map +1 -0
- package/dist/commands/cms/migrate.d.ts +3 -0
- package/dist/commands/cms/migrate.d.ts.map +1 -0
- package/dist/commands/cms/migrate.js +78 -0
- package/dist/commands/cms/migrate.js.map +1 -0
- package/dist/commands/cms/registry.d.ts +3 -0
- package/dist/commands/cms/registry.d.ts.map +1 -0
- package/dist/commands/cms/registry.js +161 -0
- package/dist/commands/cms/registry.js.map +1 -0
- package/dist/commands/cms/seed.d.ts +3 -0
- package/dist/commands/cms/seed.d.ts.map +1 -0
- package/dist/commands/cms/seed.js +102 -0
- package/dist/commands/cms/seed.js.map +1 -0
- package/dist/commands/cms/shared.d.ts +22 -0
- package/dist/commands/cms/shared.d.ts.map +1 -0
- package/dist/commands/cms/shared.js +82 -0
- package/dist/commands/cms/shared.js.map +1 -0
- package/dist/commands/doctor/target.d.ts +3 -0
- package/dist/commands/doctor/target.d.ts.map +1 -0
- package/dist/commands/doctor/target.js +46 -0
- package/dist/commands/doctor/target.js.map +1 -0
- package/dist/commands/env/list.d.ts +3 -0
- package/dist/commands/env/list.d.ts.map +1 -0
- package/dist/commands/env/list.js +28 -0
- package/dist/commands/env/list.js.map +1 -0
- package/dist/commands/env/set.d.ts +3 -0
- package/dist/commands/env/set.d.ts.map +1 -0
- package/dist/commands/env/set.js +36 -0
- package/dist/commands/env/set.js.map +1 -0
- package/dist/commands/env/use.d.ts +3 -0
- package/dist/commands/env/use.d.ts.map +1 -0
- package/dist/commands/env/use.js +15 -0
- package/dist/commands/env/use.js.map +1 -0
- package/dist/commands/legacy/connect.d.ts +3 -0
- package/dist/commands/legacy/connect.d.ts.map +1 -0
- package/dist/commands/legacy/connect.js +8 -0
- package/dist/commands/legacy/connect.js.map +1 -0
- package/dist/commands/legacy/pages.d.ts +3 -0
- package/dist/commands/legacy/pages.d.ts.map +1 -0
- package/dist/commands/legacy/pages.js +16 -0
- package/dist/commands/legacy/pages.js.map +1 -0
- package/dist/commands/legacy/spread.d.ts +3 -0
- package/dist/commands/legacy/spread.d.ts.map +1 -0
- package/dist/commands/legacy/spread.js +8 -0
- package/dist/commands/legacy/spread.js.map +1 -0
- package/dist/commands/legacy/sync.d.ts +3 -0
- package/dist/commands/legacy/sync.d.ts.map +1 -0
- package/dist/commands/legacy/sync.js +8 -0
- package/dist/commands/legacy/sync.js.map +1 -0
- package/dist/config/env-diff.d.ts +10 -0
- package/dist/config/env-diff.d.ts.map +1 -0
- package/dist/config/env-diff.js +24 -0
- package/dist/config/env-diff.js.map +1 -0
- package/dist/config/env-parser.d.ts +20 -0
- package/dist/config/env-parser.d.ts.map +1 -0
- package/dist/config/env-parser.js +70 -0
- package/dist/config/env-parser.js.map +1 -0
- package/dist/config/env-writer.d.ts +22 -0
- package/dist/config/env-writer.d.ts.map +1 -0
- package/dist/config/env-writer.js +172 -0
- package/dist/config/env-writer.js.map +1 -0
- package/dist/config/profile-store.d.ts +29 -0
- package/dist/config/profile-store.d.ts.map +1 -0
- package/dist/config/profile-store.js +257 -0
- package/dist/config/profile-store.js.map +1 -0
- package/dist/core/args.d.ts +11 -0
- package/dist/core/args.d.ts.map +1 -0
- package/dist/core/args.js +106 -0
- package/dist/core/args.js.map +1 -0
- package/dist/core/colors.d.ts +6 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +29 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/safety/target-guard.d.ts +16 -0
- package/dist/safety/target-guard.d.ts.map +1 -0
- package/dist/safety/target-guard.js +55 -0
- package/dist/safety/target-guard.js.map +1 -0
- package/dist/testing/booking-smoke.d.ts +17 -0
- package/dist/testing/booking-smoke.d.ts.map +1 -0
- package/dist/testing/booking-smoke.js +43 -0
- package/dist/testing/booking-smoke.js.map +1 -0
- package/dist/tests/agent-commands.test.d.ts +2 -0
- package/dist/tests/agent-commands.test.d.ts.map +1 -0
- package/dist/tests/agent-commands.test.js +180 -0
- package/dist/tests/agent-commands.test.js.map +1 -0
- package/dist/tests/agent-governance.test.d.ts +2 -0
- package/dist/tests/agent-governance.test.d.ts.map +1 -0
- package/dist/tests/agent-governance.test.js +233 -0
- package/dist/tests/agent-governance.test.js.map +1 -0
- package/dist/tests/app-commands.test.d.ts +2 -0
- package/dist/tests/app-commands.test.d.ts.map +1 -0
- package/dist/tests/app-commands.test.js +462 -0
- package/dist/tests/app-commands.test.js.map +1 -0
- package/dist/tests/booking-commands.test.d.ts +2 -0
- package/dist/tests/booking-commands.test.d.ts.map +1 -0
- package/dist/tests/booking-commands.test.js +204 -0
- package/dist/tests/booking-commands.test.js.map +1 -0
- package/dist/tests/booking-smoke.test.d.ts +2 -0
- package/dist/tests/booking-smoke.test.d.ts.map +1 -0
- package/dist/tests/booking-smoke.test.js +183 -0
- package/dist/tests/booking-smoke.test.js.map +1 -0
- package/dist/tests/cms-commands.test.d.ts +2 -0
- package/dist/tests/cms-commands.test.d.ts.map +1 -0
- package/dist/tests/cms-commands.test.js +254 -0
- package/dist/tests/cms-commands.test.js.map +1 -0
- package/dist/tests/cms-ops.test.d.ts +2 -0
- package/dist/tests/cms-ops.test.d.ts.map +1 -0
- package/dist/tests/cms-ops.test.js +125 -0
- package/dist/tests/cms-ops.test.js.map +1 -0
- package/dist/tests/env-writer.test.d.ts +2 -0
- package/dist/tests/env-writer.test.d.ts.map +1 -0
- package/dist/tests/env-writer.test.js +90 -0
- package/dist/tests/env-writer.test.js.map +1 -0
- package/dist/tests/profile-store.test.d.ts +2 -0
- package/dist/tests/profile-store.test.d.ts.map +1 -0
- package/dist/tests/profile-store.test.js +88 -0
- package/dist/tests/profile-store.test.js.map +1 -0
- package/dist/tests/target-guard.test.d.ts +2 -0
- package/dist/tests/target-guard.test.d.ts.map +1 -0
- package/dist/tests/target-guard.test.js +132 -0
- package/dist/tests/target-guard.test.js.map +1 -0
- package/dist/ui/logo.d.ts +2 -0
- package/dist/ui/logo.d.ts.map +1 -0
- package/dist/ui/logo.js +22 -0
- package/dist/ui/logo.js.map +1 -0
- package/package.json +17 -53
- package/.claude/settings.local.json +0 -36
- package/.cursor/rules.md +0 -203
- package/.eslintrc.js +0 -31
- package/CLAUDE.md +0 -100
- package/bin/cli.js +0 -116
- package/docs/ADDING_FRAMEWORK_DETECTORS.md +0 -391
- package/docs/ADDING_NEW_PROJECT_TYPE.md +0 -156
- package/docs/ARCHITECTURE_RELATIONSHIPS.md +0 -411
- package/docs/CLI_AUTHENTICATION.md +0 -214
- package/docs/CLI_PAGE_DETECTION_REQUIREMENTS.md +0 -519
- package/docs/CRM-PIPELINES-SEQUENCES-SPEC.md +0 -429
- package/docs/DETECTOR_ARCHITECTURE.md +0 -326
- package/docs/DEVELOPMENT.md +0 -194
- package/docs/IMPLEMENTATION_PHASES.md +0 -468
- package/docs/INTEGRATION_PATHS_ARCHITECTURE.md +0 -1543
- package/docs/OAUTH_CLARIFICATION.md +0 -258
- package/docs/OAUTH_SETUP_GUIDE_TEMPLATE.md +0 -211
- package/docs/PHASE_0_PROGRESS.md +0 -120
- package/docs/PHASE_1_COMPLETE.md +0 -366
- package/docs/PHASE_SUMMARY.md +0 -149
- package/docs/PLAN.md +0 -511
- package/docs/README.md +0 -56
- package/docs/STRIPE_INTEGRATION.md +0 -447
- package/docs/SUMMARY.md +0 -230
- package/docs/UPDATED_PLAN.md +0 -447
- package/docs/mcp_server/MCP_EXTENSION_GUIDE.md +0 -1313
- package/docs/mcp_server/MCP_SERVER_ARCHITECTURE.md +0 -1481
- package/docs/mcp_server/applicationOntology.ts +0 -817
- package/docs/mcp_server/cliApplications.ts +0 -639
- package/docs/mcp_server/crmOntology.ts +0 -1063
- package/docs/mcp_server/eventOntology.ts +0 -1183
- package/docs/mcp_server/formsOntology.ts +0 -1401
- package/docs/mcp_server/ontologySchemas.ts +0 -185
- package/docs/mcp_server/schema.ts +0 -250
- package/docs/microsass_production_machine/CLI_API_REFERENCE.md +0 -1197
- package/docs/microsass_production_machine/CLI_PRODUCT_VISION.md +0 -676
- package/docs/microsass_production_machine/CLI_REQUIREMENTS.md +0 -606
- package/docs/microsass_production_machine/CONNECTED_APPLICATIONS_SPEC.md +0 -390
- package/docs/microsass_production_machine/IMPLEMENTATION_ROADMAP.md +0 -725
- package/docs/microsass_production_machine/OBJECT_MAPPINGS.md +0 -808
- package/docs/microsass_production_machine/REFERENCE_IMPLEMENTATION.md +0 -532
- package/src/api/backend-client.js +0 -449
- package/src/commands/api-keys.js +0 -119
- package/src/commands/connect.js +0 -243
- package/src/commands/login.js +0 -332
- package/src/commands/logout.js +0 -30
- package/src/commands/mcp-server.js +0 -85
- package/src/commands/mcp-setup.js +0 -686
- package/src/commands/pages.js +0 -317
- package/src/commands/scaffold.js +0 -409
- package/src/commands/spread.js +0 -861
- package/src/commands/status.js +0 -62
- package/src/commands/sync.js +0 -169
- package/src/commands/upgrade.js +0 -48
- package/src/config/config-manager.js +0 -206
- package/src/detectors/api-client-detector.js +0 -85
- package/src/detectors/base-detector.js +0 -77
- package/src/detectors/database-detector.js +0 -245
- package/src/detectors/expo-detector.js +0 -166
- package/src/detectors/github-detector.js +0 -74
- package/src/detectors/index.js +0 -106
- package/src/detectors/mapping-suggestor.js +0 -119
- package/src/detectors/model-detector.js +0 -318
- package/src/detectors/nextjs-detector.js +0 -139
- package/src/detectors/oauth-detector.js +0 -122
- package/src/detectors/page-detector.js +0 -480
- package/src/detectors/registry.js +0 -121
- package/src/generators/api-client-generator.js +0 -223
- package/src/generators/api-only/client.js +0 -683
- package/src/generators/api-only/index.js +0 -96
- package/src/generators/api-only/types.js +0 -618
- package/src/generators/api-only/webhooks.js +0 -377
- package/src/generators/env-generator.js +0 -191
- package/src/generators/expo-auth-generator.js +0 -1009
- package/src/generators/gitignore-generator.js +0 -92
- package/src/generators/index.js +0 -166
- package/src/generators/manifest-generator.js +0 -154
- package/src/generators/mcp-guide-generator.js +0 -256
- package/src/generators/nextauth-generator.js +0 -247
- package/src/generators/oauth-guide-generator.js +0 -277
- package/src/generators/quickstart/components/index.js +0 -1699
- package/src/generators/quickstart/components-mobile/index.js +0 -1440
- package/src/generators/quickstart/database/convex.js +0 -1257
- package/src/generators/quickstart/database/index.js +0 -34
- package/src/generators/quickstart/database/supabase.js +0 -1132
- package/src/generators/quickstart/hooks/index.js +0 -1065
- package/src/generators/quickstart/index.js +0 -191
- package/src/generators/quickstart/pages/index.js +0 -1466
- package/src/generators/quickstart/screens/index.js +0 -1498
- package/src/logo.js +0 -116
- package/src/mcp/auth.js +0 -127
- package/src/mcp/registry/domains/applications.js +0 -516
- package/src/mcp/registry/domains/benefits.js +0 -798
- package/src/mcp/registry/domains/codegen.js +0 -894
- package/src/mcp/registry/domains/core.js +0 -324
- package/src/mcp/registry/domains/crm.js +0 -591
- package/src/mcp/registry/domains/events.js +0 -649
- package/src/mcp/registry/domains/forms.js +0 -696
- package/src/mcp/registry/index.js +0 -164
- package/src/mcp/server.js +0 -116
- package/src/utils/file-utils.js +0 -117
- package/src/utils/init-helpers.js +0 -243
- package/src/utils/prompt-utils.js +0 -195
- package/templates/CLAUDE.md +0 -86
- package/tests/api-client-detector.test.js +0 -214
- package/tests/api-client-generator.test.js +0 -176
- package/tests/backend-client.test.js +0 -640
- package/tests/base-detector.test.js +0 -101
- package/tests/commands/login.test.js +0 -143
- package/tests/commands/logout.test.js +0 -84
- package/tests/commands/status.test.js +0 -167
- package/tests/config-manager.test.js +0 -321
- package/tests/database-detector.test.js +0 -221
- package/tests/detector-index.test.js +0 -209
- package/tests/detector-registry.test.js +0 -93
- package/tests/env-generator.test.js +0 -278
- package/tests/expo-detector.test.js +0 -263
- package/tests/file-utils.test.js +0 -194
- package/tests/generators-index.test.js +0 -454
- package/tests/github-detector.test.js +0 -145
- package/tests/gitignore-generator.test.js +0 -109
- package/tests/logo.test.js +0 -96
- package/tests/nextauth-generator.test.js +0 -255
- package/tests/nextjs-detector.test.js +0 -235
- package/tests/oauth-detector.test.js +0 -264
- package/tests/oauth-guide-generator.test.js +0 -273
- package/tests/page-detector.test.js +0 -371
|
@@ -1,449 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backend API Client
|
|
3
|
-
* Handles communication with L4YERCAK3 backend API
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const crypto = require('crypto');
|
|
7
|
-
const fetch = require('node-fetch');
|
|
8
|
-
const configManager = require('../config/config-manager');
|
|
9
|
-
|
|
10
|
-
// API Base URL - All CLI API endpoints go through Convex HTTP (Production)
|
|
11
|
-
const API_BASE_URL = 'https://agreeable-lion-828.convex.site';
|
|
12
|
-
|
|
13
|
-
// App URL - Only used for browser login page (Next.js serves the OAuth UI)
|
|
14
|
-
const APP_URL = 'https://app.l4yercak3.com';
|
|
15
|
-
|
|
16
|
-
class BackendClient {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.baseUrl = API_BASE_URL;
|
|
19
|
-
this.appUrl = APP_URL;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Generate a cryptographically secure state token for CSRF protection
|
|
24
|
-
*/
|
|
25
|
-
generateState() {
|
|
26
|
-
return crypto.randomBytes(32).toString('hex');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Get headers for API requests
|
|
31
|
-
*/
|
|
32
|
-
getHeaders() {
|
|
33
|
-
const session = configManager.getSession();
|
|
34
|
-
const headers = {
|
|
35
|
-
'Content-Type': 'application/json',
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
if (session && session.token) {
|
|
39
|
-
headers['Authorization'] = `Bearer ${session.token}`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return headers;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Make API request
|
|
47
|
-
* All CLI API endpoints go through the Convex HTTP base URL
|
|
48
|
-
* Returns response data with error details preserved for specific handling
|
|
49
|
-
*/
|
|
50
|
-
async request(method, endpoint, data = null) {
|
|
51
|
-
const url = `${this.baseUrl}${endpoint}`;
|
|
52
|
-
const headers = this.getHeaders();
|
|
53
|
-
const options = {
|
|
54
|
-
method,
|
|
55
|
-
headers,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
|
|
59
|
-
options.body = JSON.stringify(data);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Debug logging - enable with L4YERCAK3_DEBUG=1
|
|
63
|
-
if (process.env.L4YERCAK3_DEBUG) {
|
|
64
|
-
console.log('\n[DEBUG] API Request:');
|
|
65
|
-
console.log(` URL: ${url}`);
|
|
66
|
-
console.log(` Method: ${method}`);
|
|
67
|
-
console.log(` Headers: ${JSON.stringify(headers, null, 2)}`);
|
|
68
|
-
if (options.body) {
|
|
69
|
-
console.log(` Body: ${options.body}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
const response = await fetch(url, options);
|
|
75
|
-
|
|
76
|
-
// Debug: log raw response info
|
|
77
|
-
if (process.env.L4YERCAK3_DEBUG) {
|
|
78
|
-
console.log('[DEBUG] API Response:');
|
|
79
|
-
console.log(` Status: ${response.status} ${response.statusText}`);
|
|
80
|
-
console.log(` Headers: ${JSON.stringify(Object.fromEntries(response.headers.entries()), null, 2)}`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const responseData = await response.json();
|
|
84
|
-
|
|
85
|
-
if (process.env.L4YERCAK3_DEBUG) {
|
|
86
|
-
console.log(` Body: ${JSON.stringify(responseData, null, 2)}\n`);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (!response.ok) {
|
|
90
|
-
// Create error with additional details from backend
|
|
91
|
-
const error = new Error(responseData.message || responseData.error || `API request failed: ${response.status}`);
|
|
92
|
-
error.code = responseData.code || 'UNKNOWN_ERROR';
|
|
93
|
-
error.suggestion = responseData.suggestion || null;
|
|
94
|
-
error.upgradeUrl = responseData.upgradeUrl || null;
|
|
95
|
-
error.upgradeCommand = responseData.upgradeCommand || null;
|
|
96
|
-
error.status = response.status;
|
|
97
|
-
throw error;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return responseData;
|
|
101
|
-
} catch (error) {
|
|
102
|
-
if (process.env.L4YERCAK3_DEBUG) {
|
|
103
|
-
console.log(`[DEBUG] Request error: ${error.message}`);
|
|
104
|
-
}
|
|
105
|
-
if (error.message.includes('fetch')) {
|
|
106
|
-
throw new Error(`Network error: Could not connect to backend at ${this.baseUrl}`);
|
|
107
|
-
}
|
|
108
|
-
throw error;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Validate CLI session
|
|
114
|
-
*/
|
|
115
|
-
async validateSession() {
|
|
116
|
-
try {
|
|
117
|
-
return await this.request('GET', '/api/v1/auth/cli/validate');
|
|
118
|
-
} catch (error) {
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Refresh CLI session
|
|
125
|
-
*/
|
|
126
|
-
async refreshSession() {
|
|
127
|
-
try {
|
|
128
|
-
const session = configManager.getSession();
|
|
129
|
-
if (!session || !session.token) {
|
|
130
|
-
throw new Error('No session to refresh');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const response = await this.request('POST', '/api/v1/auth/cli/refresh', {
|
|
134
|
-
token: session.token,
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
// Update session
|
|
138
|
-
configManager.saveSession({
|
|
139
|
-
...session,
|
|
140
|
-
token: response.token,
|
|
141
|
-
expiresAt: response.expiresAt,
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
return response;
|
|
145
|
-
} catch (error) {
|
|
146
|
-
configManager.clearSession();
|
|
147
|
-
throw error;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Revoke CLI session (logout on backend)
|
|
153
|
-
* This cleans up the session from the database
|
|
154
|
-
*/
|
|
155
|
-
async revokeSession() {
|
|
156
|
-
try {
|
|
157
|
-
const session = configManager.getSession();
|
|
158
|
-
if (!session || !session.token) {
|
|
159
|
-
return { success: true }; // Nothing to revoke
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return await this.request('POST', '/api/v1/auth/cli/revoke');
|
|
163
|
-
} catch (error) {
|
|
164
|
-
// Even if revoke fails, we'll clear locally
|
|
165
|
-
// Log but don't throw - user still wants to logout
|
|
166
|
-
console.error('Warning: Could not revoke session on backend:', error.message);
|
|
167
|
-
return { success: false, error: error.message };
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Get CLI login URL with state parameter for CSRF protection
|
|
173
|
-
* Browser login is served by Next.js at APP_URL (not the Convex API URL)
|
|
174
|
-
* @param {string} state - The state token generated by the CLI
|
|
175
|
-
* @param {string|null} provider - Optional OAuth provider for direct auth
|
|
176
|
-
* @returns {string} The login URL
|
|
177
|
-
*/
|
|
178
|
-
getLoginUrl(state, provider = null) {
|
|
179
|
-
// Use port 3333 to avoid conflicts with Next.js dev server (port 3000)
|
|
180
|
-
const callbackUrl = 'http://localhost:3333/callback';
|
|
181
|
-
|
|
182
|
-
if (provider) {
|
|
183
|
-
// Direct OAuth provider URL
|
|
184
|
-
return `${this.appUrl}/api/auth/oauth-signup?provider=${provider}&sessionType=cli&state=${state}&callback=${encodeURIComponent(callbackUrl)}`;
|
|
185
|
-
} else {
|
|
186
|
-
// Provider selection page
|
|
187
|
-
return `${this.appUrl}/auth/cli-login?state=${state}&callback=${encodeURIComponent(callbackUrl)}`;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* List API keys for an organization
|
|
193
|
-
* Returns: { keys, limit, currentCount, canCreateMore, limitDescription }
|
|
194
|
-
*/
|
|
195
|
-
async listApiKeys(organizationId) {
|
|
196
|
-
return await this.request('GET', `/api/v1/auth/cli/api-keys?organizationId=${organizationId}`);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Generate API key for organization
|
|
201
|
-
*/
|
|
202
|
-
async generateApiKey(organizationId, name, scopes = ['*']) {
|
|
203
|
-
return await this.request('POST', `/api/v1/auth/cli/api-keys`, {
|
|
204
|
-
organizationId,
|
|
205
|
-
name,
|
|
206
|
-
scopes,
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Get organizations for current user
|
|
212
|
-
*/
|
|
213
|
-
async getOrganizations() {
|
|
214
|
-
return await this.request('GET', '/api/v1/auth/cli/organizations');
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Create organization
|
|
219
|
-
*/
|
|
220
|
-
async createOrganization(name) {
|
|
221
|
-
return await this.request('POST', '/api/v1/auth/cli/organizations', {
|
|
222
|
-
name,
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// ============================================
|
|
227
|
-
// Connected Applications API
|
|
228
|
-
// ============================================
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Check if an application already exists for this project path
|
|
232
|
-
* @param {string} organizationId - The organization ID
|
|
233
|
-
* @param {string} projectPathHash - SHA256 hash of the project path
|
|
234
|
-
* @returns {Promise<{found: boolean, application?: object}>}
|
|
235
|
-
*/
|
|
236
|
-
async checkExistingApplication(organizationId, projectPathHash) {
|
|
237
|
-
try {
|
|
238
|
-
return await this.request(
|
|
239
|
-
'GET',
|
|
240
|
-
`/api/v1/cli/applications/by-path?organizationId=${organizationId}&hash=${projectPathHash}`
|
|
241
|
-
);
|
|
242
|
-
} catch (error) {
|
|
243
|
-
// If 404, no existing app found
|
|
244
|
-
if (error.status === 404) {
|
|
245
|
-
return { found: false };
|
|
246
|
-
}
|
|
247
|
-
throw error;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Register a new connected application
|
|
253
|
-
* @param {object} data - Application registration data
|
|
254
|
-
* @returns {Promise<{applicationId: string, apiKey?: object, backendUrl: string}>}
|
|
255
|
-
*/
|
|
256
|
-
async registerApplication(data) {
|
|
257
|
-
return await this.request('POST', '/api/v1/cli/applications', data);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Update an existing connected application
|
|
262
|
-
* @param {string} applicationId - The application ID
|
|
263
|
-
* @param {object} updates - Fields to update
|
|
264
|
-
* @returns {Promise<object>}
|
|
265
|
-
*/
|
|
266
|
-
async updateApplication(applicationId, updates) {
|
|
267
|
-
return await this.request('PATCH', `/api/v1/cli/applications/${applicationId}`, updates);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Get application details
|
|
272
|
-
* @param {string} applicationId - The application ID
|
|
273
|
-
* @returns {Promise<object>}
|
|
274
|
-
*/
|
|
275
|
-
async getApplication(applicationId) {
|
|
276
|
-
return await this.request('GET', `/api/v1/cli/applications/${applicationId}`);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* List all connected applications for an organization
|
|
281
|
-
* @param {string} organizationId - The organization ID
|
|
282
|
-
* @returns {Promise<{applications: object[]}>}
|
|
283
|
-
*/
|
|
284
|
-
async listApplications(organizationId) {
|
|
285
|
-
return await this.request('GET', `/api/v1/cli/applications?organizationId=${organizationId}`);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Sync application data
|
|
290
|
-
* @param {string} applicationId - The application ID
|
|
291
|
-
* @param {object} syncData - Sync configuration (direction, models)
|
|
292
|
-
* @returns {Promise<object>}
|
|
293
|
-
*/
|
|
294
|
-
async syncApplication(applicationId, syncData) {
|
|
295
|
-
return await this.request('POST', `/api/v1/cli/applications/${applicationId}/sync`, syncData);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// ============================================
|
|
299
|
-
// Activity Protocol / Page Detection API
|
|
300
|
-
// ============================================
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Bulk register pages for an application
|
|
304
|
-
* @param {string} applicationId - The application ID
|
|
305
|
-
* @param {Array<{path: string, name: string, pageType?: string}>} pages - Pages to register
|
|
306
|
-
* @returns {Promise<{success: boolean, results: Array, total: number, created: number, updated: number}>}
|
|
307
|
-
*/
|
|
308
|
-
async bulkRegisterPages(applicationId, pages) {
|
|
309
|
-
return await this.request('POST', '/api/v1/activity/pages/bulk', {
|
|
310
|
-
applicationId,
|
|
311
|
-
pages,
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* Register a single page
|
|
317
|
-
* @param {string} applicationId - The application ID
|
|
318
|
-
* @param {object} pageData - Page data
|
|
319
|
-
* @returns {Promise<{success: boolean, pageId: string, created: boolean}>}
|
|
320
|
-
*/
|
|
321
|
-
async registerPage(applicationId, pageData) {
|
|
322
|
-
return await this.request('POST', '/api/v1/activity/pages', {
|
|
323
|
-
applicationId,
|
|
324
|
-
...pageData,
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Get all pages for an application
|
|
330
|
-
* @param {string} applicationId - The application ID
|
|
331
|
-
* @param {object} options - Query options (status)
|
|
332
|
-
* @returns {Promise<{success: boolean, pages: Array, total: number}>}
|
|
333
|
-
*/
|
|
334
|
-
async getApplicationPages(applicationId, options = {}) {
|
|
335
|
-
let url = `/api/v1/activity/pages?applicationId=${applicationId}`;
|
|
336
|
-
if (options.status) {
|
|
337
|
-
url += `&status=${options.status}`;
|
|
338
|
-
}
|
|
339
|
-
return await this.request('GET', url);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* Log an activity event
|
|
344
|
-
* @param {string} applicationId - The application ID
|
|
345
|
-
* @param {object} eventData - Event data
|
|
346
|
-
* @returns {Promise<{success: boolean, eventId: string, timestamp: number}>}
|
|
347
|
-
*/
|
|
348
|
-
async logActivityEvent(applicationId, eventData) {
|
|
349
|
-
return await this.request('POST', '/api/v1/activity/events', {
|
|
350
|
-
applicationId,
|
|
351
|
-
...eventData,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Get activity events for an application
|
|
357
|
-
* @param {string} applicationId - The application ID
|
|
358
|
-
* @param {object} options - Query options (severity, category, limit)
|
|
359
|
-
* @returns {Promise<{success: boolean, events: Array, hasMore: boolean, nextCursor: string|null}>}
|
|
360
|
-
*/
|
|
361
|
-
async getActivityEvents(applicationId, options = {}) {
|
|
362
|
-
let url = `/api/v1/activity/events?applicationId=${applicationId}`;
|
|
363
|
-
if (options.severity) {
|
|
364
|
-
url += `&severity=${options.severity}`;
|
|
365
|
-
}
|
|
366
|
-
if (options.category) {
|
|
367
|
-
url += `&category=${options.category}`;
|
|
368
|
-
}
|
|
369
|
-
if (options.limit) {
|
|
370
|
-
url += `&limit=${options.limit}`;
|
|
371
|
-
}
|
|
372
|
-
return await this.request('GET', url);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Get activity statistics for an application
|
|
377
|
-
* @param {string} applicationId - The application ID
|
|
378
|
-
* @param {string} timeRange - Time range ('1h', '24h', '7d')
|
|
379
|
-
* @returns {Promise<{success: boolean, stats: object}>}
|
|
380
|
-
*/
|
|
381
|
-
async getActivityStats(applicationId, timeRange = '24h') {
|
|
382
|
-
return await this.request(
|
|
383
|
-
'GET',
|
|
384
|
-
`/api/v1/activity/stats?applicationId=${applicationId}&timeRange=${timeRange}`
|
|
385
|
-
);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
/**
|
|
389
|
-
* Get activity settings for an application
|
|
390
|
-
* @param {string} applicationId - The application ID
|
|
391
|
-
* @returns {Promise<object>}
|
|
392
|
-
*/
|
|
393
|
-
async getActivitySettings(applicationId) {
|
|
394
|
-
return await this.request('GET', `/api/v1/activity/settings?applicationId=${applicationId}`);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Update activity settings for an application
|
|
399
|
-
* @param {string} applicationId - The application ID
|
|
400
|
-
* @param {object} settings - Settings to update
|
|
401
|
-
* @returns {Promise<object>}
|
|
402
|
-
*/
|
|
403
|
-
async updateActivitySettings(applicationId, settings) {
|
|
404
|
-
return await this.request('PATCH', '/api/v1/activity/settings', {
|
|
405
|
-
applicationId,
|
|
406
|
-
...settings,
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
// ============================================
|
|
411
|
-
// Repository Connection API
|
|
412
|
-
// ============================================
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Connect a GitHub repository to a connected application
|
|
416
|
-
* Triggers repo analysis on the platform side
|
|
417
|
-
* @param {string} applicationId - The application ID
|
|
418
|
-
* @param {object} repoData - Repository connection data
|
|
419
|
-
* @param {string} repoData.repoUrl - Full GitHub repo URL
|
|
420
|
-
* @param {string} repoData.branch - Branch to analyze (e.g., 'main')
|
|
421
|
-
* @param {string} [repoData.githubConnectionId] - Optional GitHub OAuth connection ID
|
|
422
|
-
* @returns {Promise<object>}
|
|
423
|
-
*/
|
|
424
|
-
async connectRepo(applicationId, repoData) {
|
|
425
|
-
return await this.request(
|
|
426
|
-
'POST',
|
|
427
|
-
`/api/v1/cli/applications/${applicationId}/connect-repo`,
|
|
428
|
-
repoData
|
|
429
|
-
);
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* Sync project manifest data to the platform
|
|
434
|
-
* Pushes the .l4yercak3.json content for platform-side analysis
|
|
435
|
-
* @param {string} applicationId - The application ID
|
|
436
|
-
* @param {object} manifest - The manifest object from .l4yercak3.json
|
|
437
|
-
* @returns {Promise<object>}
|
|
438
|
-
*/
|
|
439
|
-
async syncManifest(applicationId, manifest) {
|
|
440
|
-
return await this.request(
|
|
441
|
-
'POST',
|
|
442
|
-
`/api/v1/cli/applications/${applicationId}/sync-manifest`,
|
|
443
|
-
manifest
|
|
444
|
-
);
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
module.exports = new BackendClient();
|
|
449
|
-
|
package/src/commands/api-keys.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* API Keys Command
|
|
3
|
-
* List and manage API keys for organizations
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const configManager = require('../config/config-manager');
|
|
7
|
-
const backendClient = require('../api/backend-client');
|
|
8
|
-
const inquirer = require('inquirer');
|
|
9
|
-
const chalk = require('chalk');
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* API Keys list command handler
|
|
13
|
-
*/
|
|
14
|
-
async function handleApiKeysList() {
|
|
15
|
-
// Check if logged in
|
|
16
|
-
if (!configManager.isLoggedIn()) {
|
|
17
|
-
console.log(chalk.yellow(' ⚠️ You must be logged in first'));
|
|
18
|
-
console.log(chalk.gray('\n Run "l4yercak3 login" to authenticate\n'));
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
console.log(chalk.cyan(' 🔑 API Keys\n'));
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
// Get organizations
|
|
26
|
-
const orgsResponse = await backendClient.getOrganizations();
|
|
27
|
-
const organizations = Array.isArray(orgsResponse)
|
|
28
|
-
? orgsResponse
|
|
29
|
-
: orgsResponse.organizations || orgsResponse.data || [];
|
|
30
|
-
|
|
31
|
-
if (organizations.length === 0) {
|
|
32
|
-
console.log(chalk.yellow(' ⚠️ No organizations found'));
|
|
33
|
-
console.log(chalk.gray('\n Run "l4yercak3 spread" to create an organization\n'));
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Select organization if multiple
|
|
38
|
-
let organizationId;
|
|
39
|
-
let organizationName;
|
|
40
|
-
|
|
41
|
-
if (organizations.length === 1) {
|
|
42
|
-
organizationId = organizations[0].id;
|
|
43
|
-
organizationName = organizations[0].name;
|
|
44
|
-
} else {
|
|
45
|
-
const { orgChoice } = await inquirer.prompt([
|
|
46
|
-
{
|
|
47
|
-
type: 'list',
|
|
48
|
-
name: 'orgChoice',
|
|
49
|
-
message: 'Select organization:',
|
|
50
|
-
choices: organizations.map(org => ({
|
|
51
|
-
name: `${org.name} (${org.id})`,
|
|
52
|
-
value: org.id,
|
|
53
|
-
})),
|
|
54
|
-
},
|
|
55
|
-
]);
|
|
56
|
-
organizationId = orgChoice;
|
|
57
|
-
organizationName = organizations.find(org => org.id === orgChoice)?.name;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
console.log(chalk.gray(` Organization: ${organizationName}\n`));
|
|
61
|
-
|
|
62
|
-
// List API keys
|
|
63
|
-
const keysResponse = await backendClient.listApiKeys(organizationId);
|
|
64
|
-
const keys = keysResponse.keys || [];
|
|
65
|
-
|
|
66
|
-
if (keys.length === 0) {
|
|
67
|
-
console.log(chalk.yellow(' No API keys found for this organization'));
|
|
68
|
-
console.log(chalk.gray('\n Run "l4yercak3 spread" to generate an API key\n'));
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Display keys
|
|
73
|
-
console.log(chalk.green(` Found ${keys.length} API key(s):\n`));
|
|
74
|
-
|
|
75
|
-
keys.forEach((key, i) => {
|
|
76
|
-
const maskedKey = key.key ? `${key.key.substring(0, 15)}...` : '[hidden]';
|
|
77
|
-
const name = key.name || `Key ${i + 1}`;
|
|
78
|
-
const created = key.createdAt ? new Date(key.createdAt).toLocaleDateString() : 'Unknown';
|
|
79
|
-
|
|
80
|
-
console.log(chalk.white(` ${i + 1}. ${name}`));
|
|
81
|
-
console.log(chalk.gray(` Key: ${maskedKey}`));
|
|
82
|
-
console.log(chalk.gray(` Created: ${created}`));
|
|
83
|
-
if (key.scopes) {
|
|
84
|
-
console.log(chalk.gray(` Scopes: ${key.scopes.join(', ')}`));
|
|
85
|
-
}
|
|
86
|
-
console.log('');
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// Show limit info
|
|
90
|
-
if (keysResponse.limitDescription) {
|
|
91
|
-
console.log(chalk.gray(` Limit: ${keysResponse.limitDescription}`));
|
|
92
|
-
}
|
|
93
|
-
if (keysResponse.canCreateMore !== undefined) {
|
|
94
|
-
if (keysResponse.canCreateMore) {
|
|
95
|
-
console.log(chalk.green(` ✅ You can create more API keys`));
|
|
96
|
-
} else {
|
|
97
|
-
console.log(chalk.yellow(` ⚠️ You've reached your API key limit`));
|
|
98
|
-
console.log(chalk.gray(' Upgrade at: https://app.l4yercak3.com?openWindow=store'));
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
console.log('');
|
|
102
|
-
|
|
103
|
-
} catch (error) {
|
|
104
|
-
if (error.code === 'SESSION_EXPIRED') {
|
|
105
|
-
console.log(chalk.red(`\n ❌ Session expired. Please run "l4yercak3 login" again.\n`));
|
|
106
|
-
} else if (error.code === 'NOT_AUTHORIZED') {
|
|
107
|
-
console.log(chalk.red(`\n ❌ You don't have permission to view API keys for this organization.\n`));
|
|
108
|
-
} else {
|
|
109
|
-
console.error(chalk.red(` ❌ Error listing API keys: ${error.message}\n`));
|
|
110
|
-
}
|
|
111
|
-
process.exit(1);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
module.exports = {
|
|
116
|
-
command: 'api-keys',
|
|
117
|
-
description: 'List API keys for your organizations',
|
|
118
|
-
handler: handleApiKeysList,
|
|
119
|
-
};
|