@build-astron-co/nimbus 0.4.1 → 0.4.3
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/CHANGELOG.md +268 -89
- package/README.md +26 -567
- package/dist/src/agent/compaction-agent.js +24 -12
- package/dist/src/agent/context-manager.js +2 -1
- package/dist/src/agent/expand-files.js +2 -1
- package/dist/src/agent/loop.js +71 -33
- package/dist/src/agent/permissions.js +4 -2
- package/dist/src/agent/system-prompt.js +34 -17
- package/dist/src/app.js +1 -1
- package/dist/src/auth/keychain.js +8 -4
- package/dist/src/auth/store.js +70 -107
- package/dist/src/cli/init.js +35 -19
- package/dist/src/cli/run.js +18 -10
- package/dist/src/cli/serve.js +4 -2
- package/dist/src/cli.js +52 -11
- package/dist/src/commands/alias.js +5 -3
- package/dist/src/commands/audit/index.js +2 -1
- package/dist/src/commands/aws-terraform.js +36 -18
- package/dist/src/commands/completions.js +1 -1
- package/dist/src/commands/config.js +3 -2
- package/dist/src/commands/connect-github.js +92 -0
- package/dist/src/commands/cost/index.js +3 -2
- package/dist/src/commands/deploy.js +15 -10
- package/dist/src/commands/doctor.js +9 -6
- package/dist/src/commands/drift/index.js +2 -1
- package/dist/src/commands/export.js +5 -3
- package/dist/src/commands/generate-terraform.js +110 -2
- package/dist/src/commands/import.js +3 -3
- package/dist/src/commands/incident.js +10 -5
- package/dist/src/commands/login.js +8 -93
- package/dist/src/commands/logs.js +16 -8
- package/dist/src/commands/onboarding.js +6 -4
- package/dist/src/commands/pipeline.js +6 -3
- package/dist/src/commands/plugin.js +3 -2
- package/dist/src/commands/profile.js +27 -14
- package/dist/src/commands/questionnaire.js +1 -1
- package/dist/src/commands/rollback.js +3 -2
- package/dist/src/commands/rollout.js +5 -3
- package/dist/src/commands/runbook.js +17 -10
- package/dist/src/commands/schedule.js +10 -5
- package/dist/src/commands/status.js +2 -1
- package/dist/src/commands/team-context.js +12 -7
- package/dist/src/commands/template.js +1 -1
- package/dist/src/commands/tf/index.js +6 -3
- package/dist/src/commands/upgrade.js +5 -3
- package/dist/src/commands/version.js +6 -3
- package/dist/src/commands/watch.js +6 -3
- package/dist/src/compat/sqlite.js +5 -3
- package/dist/src/config/mode-store.js +2 -1
- package/dist/src/config/profiles.js +4 -2
- package/dist/src/config/types.js +2 -1
- package/dist/src/engine/executor.js +8 -4
- package/dist/src/engine/planner.js +9 -5
- package/dist/src/llm/providers/anthropic.js +6 -3
- package/dist/src/llm/providers/ollama.js +1 -1
- package/dist/src/llm/router.js +22 -7
- package/dist/src/nimbus.js +1 -0
- package/dist/src/sessions/manager.js +6 -3
- package/dist/src/sharing/viewer.js +2 -1
- package/dist/src/tools/file-ops.js +1 -2
- package/dist/src/tools/schemas/devops.js +197 -108
- package/dist/src/tools/schemas/standard.js +1 -1
- package/dist/src/ui/App.js +25 -13
- package/dist/src/ui/FileDiffModal.js +22 -11
- package/dist/src/ui/HelpModal.js +2 -1
- package/dist/src/ui/InputBox.js +6 -3
- package/dist/src/ui/MessageList.js +40 -20
- package/dist/src/ui/TerminalPane.js +2 -1
- package/dist/src/ui/ToolCallDisplay.js +12 -6
- package/dist/src/ui/TreePane.js +2 -1
- package/dist/src/ui/ink/index.js +37 -21
- package/dist/src/version.js +1 -1
- package/dist/src/watcher/index.js +8 -4
- package/package.json +3 -5
- package/src/__tests__/alias.test.ts +0 -133
- package/src/__tests__/app.test.ts +0 -76
- package/src/__tests__/audit.test.ts +0 -877
- package/src/__tests__/circuit-breaker.test.ts +0 -116
- package/src/__tests__/cli-run.test.ts +0 -351
- package/src/__tests__/compat-sqlite.test.ts +0 -68
- package/src/__tests__/context-manager.test.ts +0 -632
- package/src/__tests__/context.test.ts +0 -242
- package/src/__tests__/devops-terminal-gaps.test.ts +0 -718
- package/src/__tests__/doctor.test.ts +0 -48
- package/src/__tests__/enterprise.test.ts +0 -401
- package/src/__tests__/export.test.ts +0 -236
- package/src/__tests__/gap-11-18-20.test.ts +0 -958
- package/src/__tests__/generator.test.ts +0 -433
- package/src/__tests__/helm-streaming.test.ts +0 -127
- package/src/__tests__/hooks.test.ts +0 -582
- package/src/__tests__/incident.test.ts +0 -179
- package/src/__tests__/init.test.ts +0 -487
- package/src/__tests__/intent-parser.test.ts +0 -229
- package/src/__tests__/llm-router.test.ts +0 -209
- package/src/__tests__/logs.test.ts +0 -107
- package/src/__tests__/loop-errors.test.ts +0 -244
- package/src/__tests__/lsp.test.ts +0 -293
- package/src/__tests__/modes.test.ts +0 -336
- package/src/__tests__/perf-optimizations.test.ts +0 -847
- package/src/__tests__/permissions.test.ts +0 -338
- package/src/__tests__/pipeline.test.ts +0 -50
- package/src/__tests__/polish-phase3.test.ts +0 -340
- package/src/__tests__/profile.test.ts +0 -237
- package/src/__tests__/rollback.test.ts +0 -83
- package/src/__tests__/runbook.test.ts +0 -219
- package/src/__tests__/schedule.test.ts +0 -206
- package/src/__tests__/serve.test.ts +0 -275
- package/src/__tests__/sessions.test.ts +0 -322
- package/src/__tests__/sharing.test.ts +0 -340
- package/src/__tests__/snapshots.test.ts +0 -581
- package/src/__tests__/standalone-migration.test.ts +0 -199
- package/src/__tests__/state-db.test.ts +0 -334
- package/src/__tests__/status.test.ts +0 -158
- package/src/__tests__/stream-with-tools.test.ts +0 -778
- package/src/__tests__/subagents.test.ts +0 -176
- package/src/__tests__/system-prompt.test.ts +0 -248
- package/src/__tests__/terminal-gap-v2.test.ts +0 -395
- package/src/__tests__/terminal-parity.test.ts +0 -393
- package/src/__tests__/tf-apply.test.ts +0 -187
- package/src/__tests__/tool-converter.test.ts +0 -256
- package/src/__tests__/tool-schemas.test.ts +0 -602
- package/src/__tests__/tools.test.ts +0 -144
- package/src/__tests__/version-json.test.ts +0 -184
- package/src/__tests__/version.test.ts +0 -49
- package/src/__tests__/watch.test.ts +0 -129
- package/src/agent/compaction-agent.ts +0 -266
- package/src/agent/context-manager.ts +0 -499
- package/src/agent/context.ts +0 -427
- package/src/agent/deploy-preview.ts +0 -487
- package/src/agent/expand-files.ts +0 -108
- package/src/agent/index.ts +0 -68
- package/src/agent/loop.ts +0 -1998
- package/src/agent/modes.ts +0 -429
- package/src/agent/permissions.ts +0 -513
- package/src/agent/subagents/base.ts +0 -116
- package/src/agent/subagents/cost.ts +0 -51
- package/src/agent/subagents/explore.ts +0 -42
- package/src/agent/subagents/general.ts +0 -54
- package/src/agent/subagents/index.ts +0 -102
- package/src/agent/subagents/infra.ts +0 -59
- package/src/agent/subagents/security.ts +0 -69
- package/src/agent/system-prompt.ts +0 -990
- package/src/app.ts +0 -180
- package/src/audit/activity-log.ts +0 -290
- package/src/audit/compliance-checker.ts +0 -540
- package/src/audit/cost-tracker.ts +0 -318
- package/src/audit/index.ts +0 -23
- package/src/audit/security-scanner.ts +0 -641
- package/src/auth/guard.ts +0 -75
- package/src/auth/index.ts +0 -56
- package/src/auth/keychain.ts +0 -82
- package/src/auth/oauth.ts +0 -465
- package/src/auth/providers.ts +0 -470
- package/src/auth/sso.ts +0 -113
- package/src/auth/store.ts +0 -505
- package/src/auth/types.ts +0 -187
- package/src/build.ts +0 -141
- package/src/cli/index.ts +0 -16
- package/src/cli/init.ts +0 -1227
- package/src/cli/openapi-spec.ts +0 -356
- package/src/cli/run.ts +0 -628
- package/src/cli/serve-auth.ts +0 -80
- package/src/cli/serve.ts +0 -539
- package/src/cli/web.ts +0 -71
- package/src/cli.ts +0 -1728
- package/src/clients/core-engine-client.ts +0 -227
- package/src/clients/enterprise-client.ts +0 -334
- package/src/clients/generator-client.ts +0 -351
- package/src/clients/git-client.ts +0 -627
- package/src/clients/github-client.ts +0 -410
- package/src/clients/helm-client.ts +0 -504
- package/src/clients/index.ts +0 -80
- package/src/clients/k8s-client.ts +0 -497
- package/src/clients/llm-client.ts +0 -161
- package/src/clients/rest-client.ts +0 -130
- package/src/clients/service-discovery.ts +0 -38
- package/src/clients/terraform-client.ts +0 -482
- package/src/clients/tools-client.ts +0 -1843
- package/src/clients/ws-client.ts +0 -115
- package/src/commands/alias.ts +0 -100
- package/src/commands/analyze/index.ts +0 -352
- package/src/commands/apply/helm.ts +0 -473
- package/src/commands/apply/index.ts +0 -213
- package/src/commands/apply/k8s.ts +0 -454
- package/src/commands/apply/terraform.ts +0 -582
- package/src/commands/ask.ts +0 -167
- package/src/commands/audit/index.ts +0 -357
- package/src/commands/auth-cloud.ts +0 -407
- package/src/commands/auth-list.ts +0 -134
- package/src/commands/auth-profile.ts +0 -121
- package/src/commands/auth-refresh.ts +0 -187
- package/src/commands/auth-status.ts +0 -141
- package/src/commands/aws/ec2.ts +0 -501
- package/src/commands/aws/iam.ts +0 -397
- package/src/commands/aws/index.ts +0 -133
- package/src/commands/aws/lambda.ts +0 -396
- package/src/commands/aws/rds.ts +0 -439
- package/src/commands/aws/s3.ts +0 -439
- package/src/commands/aws/vpc.ts +0 -393
- package/src/commands/aws-discover.ts +0 -542
- package/src/commands/aws-terraform.ts +0 -755
- package/src/commands/azure/aks.ts +0 -376
- package/src/commands/azure/functions.ts +0 -253
- package/src/commands/azure/index.ts +0 -116
- package/src/commands/azure/storage.ts +0 -478
- package/src/commands/azure/vm.ts +0 -355
- package/src/commands/billing/index.ts +0 -256
- package/src/commands/chat.ts +0 -320
- package/src/commands/completions.ts +0 -268
- package/src/commands/config.ts +0 -372
- package/src/commands/cost/cloud-cost-estimator.ts +0 -266
- package/src/commands/cost/estimator.ts +0 -79
- package/src/commands/cost/index.ts +0 -810
- package/src/commands/cost/parsers/terraform.ts +0 -273
- package/src/commands/cost/parsers/types.ts +0 -25
- package/src/commands/cost/pricing/aws.ts +0 -544
- package/src/commands/cost/pricing/azure.ts +0 -499
- package/src/commands/cost/pricing/gcp.ts +0 -396
- package/src/commands/cost/pricing/index.ts +0 -40
- package/src/commands/demo.ts +0 -250
- package/src/commands/deploy.ts +0 -260
- package/src/commands/doctor.ts +0 -1386
- package/src/commands/drift/index.ts +0 -787
- package/src/commands/explain.ts +0 -277
- package/src/commands/export.ts +0 -146
- package/src/commands/feedback.ts +0 -389
- package/src/commands/fix.ts +0 -324
- package/src/commands/fs/index.ts +0 -402
- package/src/commands/gcp/compute.ts +0 -325
- package/src/commands/gcp/functions.ts +0 -271
- package/src/commands/gcp/gke.ts +0 -438
- package/src/commands/gcp/iam.ts +0 -344
- package/src/commands/gcp/index.ts +0 -129
- package/src/commands/gcp/storage.ts +0 -284
- package/src/commands/generate-helm.ts +0 -1249
- package/src/commands/generate-k8s.ts +0 -1508
- package/src/commands/generate-terraform.ts +0 -1202
- package/src/commands/gh/index.ts +0 -863
- package/src/commands/git/index.ts +0 -1343
- package/src/commands/helm/index.ts +0 -1126
- package/src/commands/help.ts +0 -715
- package/src/commands/history.ts +0 -149
- package/src/commands/import.ts +0 -868
- package/src/commands/incident.ts +0 -166
- package/src/commands/index.ts +0 -367
- package/src/commands/init.ts +0 -1051
- package/src/commands/k8s/index.ts +0 -1137
- package/src/commands/login.ts +0 -716
- package/src/commands/logout.ts +0 -83
- package/src/commands/logs.ts +0 -167
- package/src/commands/onboarding.ts +0 -405
- package/src/commands/pipeline.ts +0 -186
- package/src/commands/plan/display.ts +0 -279
- package/src/commands/plan/index.ts +0 -599
- package/src/commands/plugin.ts +0 -398
- package/src/commands/preview.ts +0 -452
- package/src/commands/profile.ts +0 -342
- package/src/commands/questionnaire.ts +0 -1172
- package/src/commands/resume.ts +0 -47
- package/src/commands/rollback.ts +0 -315
- package/src/commands/rollout.ts +0 -88
- package/src/commands/runbook.ts +0 -346
- package/src/commands/schedule.ts +0 -236
- package/src/commands/status.ts +0 -252
- package/src/commands/team/index.ts +0 -346
- package/src/commands/team-context.ts +0 -220
- package/src/commands/template.ts +0 -233
- package/src/commands/tf/index.ts +0 -1093
- package/src/commands/upgrade.ts +0 -607
- package/src/commands/usage/index.ts +0 -134
- package/src/commands/version.ts +0 -174
- package/src/commands/watch.ts +0 -153
- package/src/compat/index.ts +0 -2
- package/src/compat/runtime.ts +0 -12
- package/src/compat/sqlite.ts +0 -177
- package/src/config/index.ts +0 -17
- package/src/config/manager.ts +0 -530
- package/src/config/mode-store.ts +0 -62
- package/src/config/profiles.ts +0 -84
- package/src/config/safety-policy.ts +0 -358
- package/src/config/schema.ts +0 -125
- package/src/config/types.ts +0 -609
- package/src/config/workspace-state.ts +0 -53
- package/src/context/context-db.ts +0 -199
- package/src/demo/index.ts +0 -349
- package/src/demo/scenarios/full-journey.ts +0 -229
- package/src/demo/scenarios/getting-started.ts +0 -127
- package/src/demo/scenarios/helm-release.ts +0 -341
- package/src/demo/scenarios/k8s-deployment.ts +0 -194
- package/src/demo/scenarios/terraform-vpc.ts +0 -170
- package/src/demo/types.ts +0 -92
- package/src/engine/cost-estimator.ts +0 -480
- package/src/engine/diagram-generator.ts +0 -256
- package/src/engine/drift-detector.ts +0 -902
- package/src/engine/executor.ts +0 -1066
- package/src/engine/index.ts +0 -76
- package/src/engine/orchestrator.ts +0 -636
- package/src/engine/planner.ts +0 -787
- package/src/engine/safety.ts +0 -743
- package/src/engine/verifier.ts +0 -770
- package/src/enterprise/audit.ts +0 -348
- package/src/enterprise/auth.ts +0 -270
- package/src/enterprise/billing.ts +0 -822
- package/src/enterprise/index.ts +0 -17
- package/src/enterprise/teams.ts +0 -443
- package/src/generator/best-practices.ts +0 -1608
- package/src/generator/helm.ts +0 -630
- package/src/generator/index.ts +0 -37
- package/src/generator/intent-parser.ts +0 -514
- package/src/generator/kubernetes.ts +0 -976
- package/src/generator/terraform.ts +0 -1875
- package/src/history/index.ts +0 -8
- package/src/history/manager.ts +0 -250
- package/src/history/types.ts +0 -34
- package/src/hooks/config.ts +0 -432
- package/src/hooks/engine.ts +0 -392
- package/src/hooks/index.ts +0 -4
- package/src/llm/auth-bridge.ts +0 -198
- package/src/llm/circuit-breaker.ts +0 -140
- package/src/llm/config-loader.ts +0 -201
- package/src/llm/cost-calculator.ts +0 -171
- package/src/llm/index.ts +0 -8
- package/src/llm/model-aliases.ts +0 -115
- package/src/llm/provider-registry.ts +0 -63
- package/src/llm/providers/anthropic.ts +0 -462
- package/src/llm/providers/bedrock.ts +0 -477
- package/src/llm/providers/google.ts +0 -405
- package/src/llm/providers/ollama.ts +0 -767
- package/src/llm/providers/openai-compatible.ts +0 -340
- package/src/llm/providers/openai.ts +0 -328
- package/src/llm/providers/openrouter.ts +0 -338
- package/src/llm/router.ts +0 -1104
- package/src/llm/types.ts +0 -232
- package/src/lsp/client.ts +0 -298
- package/src/lsp/languages.ts +0 -119
- package/src/lsp/manager.ts +0 -294
- package/src/mcp/client.ts +0 -402
- package/src/mcp/index.ts +0 -5
- package/src/mcp/manager.ts +0 -133
- package/src/nimbus.ts +0 -233
- package/src/plugins/index.ts +0 -27
- package/src/plugins/loader.ts +0 -334
- package/src/plugins/manager.ts +0 -376
- package/src/plugins/types.ts +0 -284
- package/src/scanners/cicd-scanner.ts +0 -258
- package/src/scanners/cloud-scanner.ts +0 -466
- package/src/scanners/framework-scanner.ts +0 -469
- package/src/scanners/iac-scanner.ts +0 -388
- package/src/scanners/index.ts +0 -539
- package/src/scanners/language-scanner.ts +0 -276
- package/src/scanners/package-manager-scanner.ts +0 -277
- package/src/scanners/types.ts +0 -172
- package/src/sessions/manager.ts +0 -472
- package/src/sessions/types.ts +0 -44
- package/src/sharing/sync.ts +0 -300
- package/src/sharing/viewer.ts +0 -163
- package/src/snapshots/index.ts +0 -2
- package/src/snapshots/manager.ts +0 -530
- package/src/state/artifacts.ts +0 -147
- package/src/state/audit.ts +0 -137
- package/src/state/billing.ts +0 -240
- package/src/state/checkpoints.ts +0 -117
- package/src/state/config.ts +0 -67
- package/src/state/conversations.ts +0 -14
- package/src/state/credentials.ts +0 -154
- package/src/state/db.ts +0 -58
- package/src/state/index.ts +0 -26
- package/src/state/messages.ts +0 -115
- package/src/state/projects.ts +0 -123
- package/src/state/schema.ts +0 -236
- package/src/state/sessions.ts +0 -147
- package/src/state/teams.ts +0 -200
- package/src/telemetry.ts +0 -108
- package/src/tools/aws-ops.ts +0 -952
- package/src/tools/azure-ops.ts +0 -579
- package/src/tools/file-ops.ts +0 -615
- package/src/tools/gcp-ops.ts +0 -625
- package/src/tools/git-ops.ts +0 -773
- package/src/tools/github-ops.ts +0 -799
- package/src/tools/helm-ops.ts +0 -943
- package/src/tools/index.ts +0 -17
- package/src/tools/k8s-ops.ts +0 -819
- package/src/tools/schemas/converter.ts +0 -184
- package/src/tools/schemas/devops.ts +0 -3502
- package/src/tools/schemas/index.ts +0 -73
- package/src/tools/schemas/standard.ts +0 -1148
- package/src/tools/schemas/types.ts +0 -735
- package/src/tools/spawn-exec.ts +0 -148
- package/src/tools/terraform-ops.ts +0 -862
- package/src/types/ambient.d.ts +0 -193
- package/src/types/config.ts +0 -83
- package/src/types/drift.ts +0 -116
- package/src/types/enterprise.ts +0 -335
- package/src/types/index.ts +0 -20
- package/src/types/plan.ts +0 -44
- package/src/types/request.ts +0 -65
- package/src/types/response.ts +0 -54
- package/src/types/service.ts +0 -51
- package/src/ui/App.tsx +0 -2114
- package/src/ui/DeployPreview.tsx +0 -174
- package/src/ui/FileDiffModal.tsx +0 -162
- package/src/ui/Header.tsx +0 -131
- package/src/ui/HelpModal.tsx +0 -57
- package/src/ui/InputBox.tsx +0 -503
- package/src/ui/MessageList.tsx +0 -1032
- package/src/ui/PermissionPrompt.tsx +0 -163
- package/src/ui/StatusBar.tsx +0 -277
- package/src/ui/TerminalPane.tsx +0 -84
- package/src/ui/ToolCallDisplay.tsx +0 -643
- package/src/ui/TreePane.tsx +0 -132
- package/src/ui/chat-ui.ts +0 -850
- package/src/ui/index.ts +0 -33
- package/src/ui/ink/index.ts +0 -1444
- package/src/ui/streaming.ts +0 -176
- package/src/ui/theme.ts +0 -104
- package/src/ui/types.ts +0 -75
- package/src/utils/analytics.ts +0 -72
- package/src/utils/cost-warning.ts +0 -27
- package/src/utils/env.ts +0 -46
- package/src/utils/errors.ts +0 -69
- package/src/utils/event-bus.ts +0 -38
- package/src/utils/index.ts +0 -24
- package/src/utils/logger.ts +0 -171
- package/src/utils/rate-limiter.ts +0 -121
- package/src/utils/service-auth.ts +0 -49
- package/src/utils/validation.ts +0 -53
- package/src/version.ts +0 -4
- package/src/watcher/index.ts +0 -214
- package/src/wizard/approval.ts +0 -383
- package/src/wizard/index.ts +0 -25
- package/src/wizard/prompts.ts +0 -338
- package/src/wizard/types.ts +0 -172
- package/src/wizard/ui.ts +0 -556
- package/src/wizard/wizard.ts +0 -304
- package/tsconfig.json +0 -24
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloud Credential Management Commands
|
|
3
|
-
*
|
|
4
|
-
* Validate and display cloud provider credentials.
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* nimbus auth aws [--profile <name>]
|
|
8
|
-
* nimbus auth gcp [--project <name>]
|
|
9
|
-
* nimbus auth azure [--subscription <id>]
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { logger } from '../utils';
|
|
13
|
-
import { ui } from '../wizard/ui';
|
|
14
|
-
|
|
15
|
-
export interface AuthCloudOptions {
|
|
16
|
-
profile?: string;
|
|
17
|
-
project?: string;
|
|
18
|
-
subscription?: string;
|
|
19
|
-
region?: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Check if a CLI tool is installed
|
|
24
|
-
*/
|
|
25
|
-
async function isCliInstalled(cmd: string): Promise<boolean> {
|
|
26
|
-
const { execFile } = await import('child_process');
|
|
27
|
-
const { promisify } = await import('util');
|
|
28
|
-
const execFileAsync = promisify(execFile);
|
|
29
|
-
|
|
30
|
-
try {
|
|
31
|
-
await execFileAsync(cmd, ['--version'], { timeout: 5000 });
|
|
32
|
-
return true;
|
|
33
|
-
} catch {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Run a CLI command and capture output
|
|
40
|
-
*/
|
|
41
|
-
async function runCommand(
|
|
42
|
-
cmd: string,
|
|
43
|
-
args: string[]
|
|
44
|
-
): Promise<{ stdout: string; success: boolean }> {
|
|
45
|
-
const { execFile } = await import('child_process');
|
|
46
|
-
const { promisify } = await import('util');
|
|
47
|
-
const execFileAsync = promisify(execFile);
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
const { stdout } = await execFileAsync(cmd, args, { timeout: 15000 });
|
|
51
|
-
return { stdout: stdout.trim(), success: true };
|
|
52
|
-
} catch (error: any) {
|
|
53
|
-
return { stdout: error.stdout?.trim() || error.message, success: false };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* nimbus auth aws — Validate AWS credentials
|
|
59
|
-
*/
|
|
60
|
-
export async function authAwsCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
61
|
-
logger.info('Validating AWS credentials', { options });
|
|
62
|
-
|
|
63
|
-
ui.header('AWS Credentials');
|
|
64
|
-
|
|
65
|
-
// Check if AWS CLI is installed
|
|
66
|
-
const installed = await isCliInstalled('aws');
|
|
67
|
-
if (!installed) {
|
|
68
|
-
ui.error('AWS CLI is not installed');
|
|
69
|
-
ui.newLine();
|
|
70
|
-
ui.print('Install the AWS CLI:');
|
|
71
|
-
ui.print(` ${ui.dim('brew install awscli')} (macOS)`);
|
|
72
|
-
ui.print(` ${ui.dim('pip install awscli')} (pip)`);
|
|
73
|
-
ui.print(` ${ui.dim('https://aws.amazon.com/cli/')} (official)`);
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
ui.startSpinner({ message: 'Validating AWS credentials...' });
|
|
78
|
-
|
|
79
|
-
// Get caller identity
|
|
80
|
-
const identityArgs = ['sts', 'get-caller-identity', '--output', 'json'];
|
|
81
|
-
if (options.profile) {
|
|
82
|
-
identityArgs.push('--profile', options.profile);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const identity = await runCommand('aws', identityArgs);
|
|
86
|
-
|
|
87
|
-
if (!identity.success) {
|
|
88
|
-
ui.stopSpinnerFail('AWS credentials validation failed');
|
|
89
|
-
ui.newLine();
|
|
90
|
-
ui.error('Unable to validate AWS credentials');
|
|
91
|
-
ui.print(ui.dim(identity.stdout));
|
|
92
|
-
ui.newLine();
|
|
93
|
-
ui.print('Configure credentials:');
|
|
94
|
-
ui.print(` ${ui.dim('aws configure')}`);
|
|
95
|
-
ui.print(` ${ui.dim('export AWS_ACCESS_KEY_ID=...')}`);
|
|
96
|
-
ui.print(` ${ui.dim('export AWS_SECRET_ACCESS_KEY=...')}`);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
ui.stopSpinnerSuccess('AWS credentials valid');
|
|
101
|
-
ui.newLine();
|
|
102
|
-
|
|
103
|
-
// Parse identity
|
|
104
|
-
try {
|
|
105
|
-
const data = JSON.parse(identity.stdout);
|
|
106
|
-
ui.print(` ${ui.bold('Account:')} ${data.Account}`);
|
|
107
|
-
ui.print(` ${ui.bold('User ARN:')} ${data.Arn}`);
|
|
108
|
-
ui.print(` ${ui.bold('User ID:')} ${data.UserId}`);
|
|
109
|
-
} catch {
|
|
110
|
-
ui.print(` ${identity.stdout}`);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Get current region
|
|
114
|
-
const regionArgs = ['configure', 'get', 'region'];
|
|
115
|
-
if (options.profile) {
|
|
116
|
-
regionArgs.push('--profile', options.profile);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const region = await runCommand('aws', regionArgs);
|
|
120
|
-
if (region.success && region.stdout) {
|
|
121
|
-
ui.print(` ${ui.bold('Region:')} ${region.stdout}`);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (options.profile) {
|
|
125
|
-
ui.print(` ${ui.bold('Profile:')} ${options.profile}`);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
ui.newLine();
|
|
129
|
-
ui.success('AWS credentials are configured and valid');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* nimbus auth gcp — Validate GCP credentials
|
|
134
|
-
*/
|
|
135
|
-
export async function authGcpCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
136
|
-
logger.info('Validating GCP credentials', { options });
|
|
137
|
-
|
|
138
|
-
ui.header('GCP Credentials');
|
|
139
|
-
|
|
140
|
-
// Check if gcloud CLI is installed
|
|
141
|
-
const installed = await isCliInstalled('gcloud');
|
|
142
|
-
if (!installed) {
|
|
143
|
-
ui.error('Google Cloud SDK (gcloud) is not installed');
|
|
144
|
-
ui.newLine();
|
|
145
|
-
ui.print('Install the Google Cloud SDK:');
|
|
146
|
-
ui.print(` ${ui.dim('brew install google-cloud-sdk')} (macOS)`);
|
|
147
|
-
ui.print(` ${ui.dim('https://cloud.google.com/sdk/docs/install')} (official)`);
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
ui.startSpinner({ message: 'Validating GCP credentials...' });
|
|
152
|
-
|
|
153
|
-
// Get current account
|
|
154
|
-
const account = await runCommand('gcloud', [
|
|
155
|
-
'auth',
|
|
156
|
-
'list',
|
|
157
|
-
'--filter=status:ACTIVE',
|
|
158
|
-
'--format=value(account)',
|
|
159
|
-
]);
|
|
160
|
-
|
|
161
|
-
if (!account.success || !account.stdout) {
|
|
162
|
-
ui.stopSpinnerFail('GCP credentials validation failed');
|
|
163
|
-
ui.newLine();
|
|
164
|
-
ui.error('No active GCP credentials found');
|
|
165
|
-
ui.print('Configure credentials:');
|
|
166
|
-
ui.print(` ${ui.dim('gcloud auth login')}`);
|
|
167
|
-
ui.print(` ${ui.dim('gcloud auth application-default login')}`);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
ui.stopSpinnerSuccess('GCP credentials valid');
|
|
172
|
-
ui.newLine();
|
|
173
|
-
|
|
174
|
-
ui.print(` ${ui.bold('Account:')} ${account.stdout}`);
|
|
175
|
-
|
|
176
|
-
// Check Application Default Credentials
|
|
177
|
-
const adcCheck = await runCommand('gcloud', [
|
|
178
|
-
'auth',
|
|
179
|
-
'application-default',
|
|
180
|
-
'print-access-token',
|
|
181
|
-
]);
|
|
182
|
-
if (adcCheck.success) {
|
|
183
|
-
ui.print(` ${ui.bold('ADC:')} ${ui.color('configured', 'green')}`);
|
|
184
|
-
} else {
|
|
185
|
-
ui.print(` ${ui.bold('ADC:')} ${ui.color('not configured', 'yellow')}`);
|
|
186
|
-
ui.print(ui.dim(' Set with: gcloud auth application-default login'));
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Get current project
|
|
190
|
-
const projectArgs = options.project
|
|
191
|
-
? ['config', 'get-value', 'project', '--project', options.project]
|
|
192
|
-
: ['config', 'get-value', 'project'];
|
|
193
|
-
const project = await runCommand('gcloud', projectArgs);
|
|
194
|
-
if (project.success && project.stdout && project.stdout !== '(unset)') {
|
|
195
|
-
ui.print(` ${ui.bold('Project:')} ${project.stdout}`);
|
|
196
|
-
} else if (options.project) {
|
|
197
|
-
ui.print(` ${ui.bold('Project:')} ${options.project}`);
|
|
198
|
-
} else {
|
|
199
|
-
ui.print(` ${ui.bold('Project:')} ${ui.color('not set', 'yellow')}`);
|
|
200
|
-
ui.print(ui.dim(' Set with: gcloud config set project PROJECT_ID'));
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Get current region
|
|
204
|
-
const region = await runCommand('gcloud', ['config', 'get-value', 'compute/region']);
|
|
205
|
-
if (region.success && region.stdout && region.stdout !== '(unset)') {
|
|
206
|
-
ui.print(` ${ui.bold('Region:')} ${region.stdout}`);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
ui.newLine();
|
|
210
|
-
ui.success('GCP credentials are configured and valid');
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* nimbus auth azure — Validate Azure credentials
|
|
215
|
-
*/
|
|
216
|
-
export async function authAzureCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
217
|
-
logger.info('Validating Azure credentials', { options });
|
|
218
|
-
|
|
219
|
-
ui.header('Azure Credentials');
|
|
220
|
-
|
|
221
|
-
// Check if az CLI is installed
|
|
222
|
-
const installed = await isCliInstalled('az');
|
|
223
|
-
if (!installed) {
|
|
224
|
-
ui.error('Azure CLI (az) is not installed');
|
|
225
|
-
ui.newLine();
|
|
226
|
-
ui.print('Install the Azure CLI:');
|
|
227
|
-
ui.print(` ${ui.dim('brew install azure-cli')} (macOS)`);
|
|
228
|
-
ui.print(
|
|
229
|
-
` ${ui.dim('https://learn.microsoft.com/en-us/cli/azure/install-azure-cli')} (official)`
|
|
230
|
-
);
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
ui.startSpinner({ message: 'Validating Azure credentials...' });
|
|
235
|
-
|
|
236
|
-
// Get current account
|
|
237
|
-
const account = await runCommand('az', ['account', 'show', '--output', 'json']);
|
|
238
|
-
|
|
239
|
-
if (!account.success) {
|
|
240
|
-
ui.stopSpinnerFail('Azure credentials validation failed');
|
|
241
|
-
ui.newLine();
|
|
242
|
-
ui.error('No active Azure credentials found');
|
|
243
|
-
ui.print('Configure credentials:');
|
|
244
|
-
ui.print(` ${ui.dim('az login')}`);
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
ui.stopSpinnerSuccess('Azure credentials valid');
|
|
249
|
-
ui.newLine();
|
|
250
|
-
|
|
251
|
-
try {
|
|
252
|
-
const data = JSON.parse(account.stdout);
|
|
253
|
-
ui.print(` ${ui.bold('Subscription:')} ${data.name} (${data.id})`);
|
|
254
|
-
ui.print(` ${ui.bold('Tenant:')} ${data.tenantId}`);
|
|
255
|
-
ui.print(` ${ui.bold('State:')} ${data.state}`);
|
|
256
|
-
|
|
257
|
-
if (data.user) {
|
|
258
|
-
ui.print(` ${ui.bold('User:')} ${data.user.name} (${data.user.type})`);
|
|
259
|
-
}
|
|
260
|
-
} catch {
|
|
261
|
-
ui.print(` ${account.stdout}`);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
ui.newLine();
|
|
265
|
-
ui.success('Azure credentials are configured and valid');
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* H1: AWS SSO Login — delegates to `aws sso login` so the CLI handles the browser flow.
|
|
270
|
-
* spawnSync with stdio: 'inherit' so device codes / browser prompts appear in terminal.
|
|
271
|
-
*/
|
|
272
|
-
export async function loginAwsCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
273
|
-
const installed = await isCliInstalled('aws');
|
|
274
|
-
if (!installed) {
|
|
275
|
-
ui.error('AWS CLI is not installed. Install from https://aws.amazon.com/cli/');
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
ui.info('Launching AWS SSO login...');
|
|
280
|
-
ui.print(ui.dim('The browser (or device code) flow is handled by the AWS CLI.'));
|
|
281
|
-
ui.newLine();
|
|
282
|
-
|
|
283
|
-
const { spawnSync } = await import('child_process');
|
|
284
|
-
const args = ['sso', 'login'];
|
|
285
|
-
if (options.profile) {
|
|
286
|
-
args.push('--profile', options.profile);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const result = spawnSync('aws', args, { stdio: 'inherit' });
|
|
290
|
-
if (result.status === 0) {
|
|
291
|
-
ui.success('AWS SSO login completed successfully.');
|
|
292
|
-
} else {
|
|
293
|
-
ui.error('AWS SSO login failed or was cancelled.');
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* H1: GCP Login — delegates to `gcloud auth login --no-launch-browser` (device code flow).
|
|
299
|
-
*/
|
|
300
|
-
export async function loginGcpCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
301
|
-
const installed = await isCliInstalled('gcloud');
|
|
302
|
-
if (!installed) {
|
|
303
|
-
ui.error('Google Cloud SDK not installed. See https://cloud.google.com/sdk/docs/install');
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
ui.info('Launching GCP device-code login...');
|
|
308
|
-
ui.print(ui.dim('Follow the URL and code shown below to complete authentication.'));
|
|
309
|
-
ui.newLine();
|
|
310
|
-
|
|
311
|
-
const { spawnSync } = await import('child_process');
|
|
312
|
-
const args = ['auth', 'login', '--no-launch-browser'];
|
|
313
|
-
if (options.project) {
|
|
314
|
-
args.push('--project', options.project);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const result = spawnSync('gcloud', args, { stdio: 'inherit' });
|
|
318
|
-
if (result.status === 0) {
|
|
319
|
-
ui.success('GCP login completed successfully.');
|
|
320
|
-
} else {
|
|
321
|
-
ui.error('GCP login failed or was cancelled.');
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* H1: Azure Login — delegates to `az login --use-device-code`.
|
|
327
|
-
*/
|
|
328
|
-
export async function loginAzureCommand(options: AuthCloudOptions = {}): Promise<void> {
|
|
329
|
-
const installed = await isCliInstalled('az');
|
|
330
|
-
if (!installed) {
|
|
331
|
-
ui.error('Azure CLI not installed. See https://learn.microsoft.com/en-us/cli/azure/install-azure-cli');
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
ui.info('Launching Azure device-code login...');
|
|
336
|
-
ui.print(ui.dim('Follow the URL and code shown below to complete authentication.'));
|
|
337
|
-
ui.newLine();
|
|
338
|
-
|
|
339
|
-
const { spawnSync } = await import('child_process');
|
|
340
|
-
const args = ['login', '--use-device-code'];
|
|
341
|
-
if (options.subscription) {
|
|
342
|
-
args.push('--subscription', options.subscription);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const result = spawnSync('az', args, { stdio: 'inherit' });
|
|
346
|
-
if (result.status === 0) {
|
|
347
|
-
ui.success('Azure login completed successfully.');
|
|
348
|
-
} else {
|
|
349
|
-
ui.error('Azure login failed or was cancelled.');
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Cloud auth parent command router
|
|
355
|
-
*/
|
|
356
|
-
export async function authCloudCommand(
|
|
357
|
-
provider: string,
|
|
358
|
-
options: AuthCloudOptions = {}
|
|
359
|
-
): Promise<void> {
|
|
360
|
-
switch (provider) {
|
|
361
|
-
case 'aws':
|
|
362
|
-
await authAwsCommand(options);
|
|
363
|
-
break;
|
|
364
|
-
case 'gcp':
|
|
365
|
-
case 'google':
|
|
366
|
-
await authGcpCommand(options);
|
|
367
|
-
break;
|
|
368
|
-
case 'azure':
|
|
369
|
-
await authAzureCommand(options);
|
|
370
|
-
break;
|
|
371
|
-
default:
|
|
372
|
-
ui.error(`Unknown cloud provider: ${provider}`);
|
|
373
|
-
ui.newLine();
|
|
374
|
-
ui.print('Supported providers:');
|
|
375
|
-
ui.print(' nimbus auth aws — Validate AWS credentials');
|
|
376
|
-
ui.print(' nimbus auth gcp — Validate GCP credentials');
|
|
377
|
-
ui.print(' nimbus auth azure — Validate Azure credentials');
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* Cloud login command router — delegates to CLI tools for SSO/OAuth flows (H1).
|
|
383
|
-
*/
|
|
384
|
-
export async function loginCloudCommand(
|
|
385
|
-
provider: string,
|
|
386
|
-
options: AuthCloudOptions = {}
|
|
387
|
-
): Promise<void> {
|
|
388
|
-
switch (provider) {
|
|
389
|
-
case 'aws':
|
|
390
|
-
await loginAwsCommand(options);
|
|
391
|
-
break;
|
|
392
|
-
case 'gcp':
|
|
393
|
-
case 'google':
|
|
394
|
-
await loginGcpCommand(options);
|
|
395
|
-
break;
|
|
396
|
-
case 'azure':
|
|
397
|
-
await loginAzureCommand(options);
|
|
398
|
-
break;
|
|
399
|
-
default:
|
|
400
|
-
ui.error(`Unknown cloud provider: ${provider}`);
|
|
401
|
-
ui.newLine();
|
|
402
|
-
ui.print('Supported providers:');
|
|
403
|
-
ui.print(' nimbus auth login aws — AWS SSO login (browser/device code)');
|
|
404
|
-
ui.print(' nimbus auth login gcp — GCP device-code login');
|
|
405
|
-
ui.print(' nimbus auth login azure — Azure device-code login');
|
|
406
|
-
}
|
|
407
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth List Command
|
|
3
|
-
*
|
|
4
|
-
* Display all available providers and their configuration status
|
|
5
|
-
*
|
|
6
|
-
* Usage: nimbus auth list
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { logger } from '../utils';
|
|
10
|
-
import { ui } from '../wizard';
|
|
11
|
-
import { authStore, AuthStore, getProviderNames, getProviderInfo } from '../auth';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Command options
|
|
15
|
-
*/
|
|
16
|
-
export interface AuthListOptions {
|
|
17
|
-
json?: boolean;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Run the auth list command
|
|
22
|
-
*/
|
|
23
|
-
export async function authListCommand(options: AuthListOptions = {}): Promise<void> {
|
|
24
|
-
logger.info('Listing auth providers');
|
|
25
|
-
|
|
26
|
-
const providerNames = getProviderNames();
|
|
27
|
-
const status = authStore.getStatus();
|
|
28
|
-
const configuredProviders = new Set(status.providers.map(p => p.name));
|
|
29
|
-
|
|
30
|
-
// Build provider data
|
|
31
|
-
const providerData = providerNames.map(name => {
|
|
32
|
-
const info = getProviderInfo(name);
|
|
33
|
-
const credential = authStore.getProvider(name);
|
|
34
|
-
const isConfigured = configuredProviders.has(name);
|
|
35
|
-
const isDefault = status.defaultProvider === name;
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
name,
|
|
39
|
-
displayName: info.displayName,
|
|
40
|
-
description: info.description,
|
|
41
|
-
isConfigured,
|
|
42
|
-
isDefault,
|
|
43
|
-
model: credential?.model || info.models.find(m => m.isDefault)?.id || info.models[0].id,
|
|
44
|
-
apiKey: credential?.apiKey,
|
|
45
|
-
baseUrl: credential?.baseUrl,
|
|
46
|
-
requiresApiKey: info.requiresApiKey,
|
|
47
|
-
apiKeyUrl: info.apiKeyUrl,
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
// JSON output mode
|
|
52
|
-
if (options.json) {
|
|
53
|
-
const safeOutput = providerData.map(p => ({
|
|
54
|
-
name: p.name,
|
|
55
|
-
displayName: p.displayName,
|
|
56
|
-
description: p.description,
|
|
57
|
-
isConfigured: p.isConfigured,
|
|
58
|
-
isDefault: p.isDefault,
|
|
59
|
-
model: p.model,
|
|
60
|
-
apiKey: p.apiKey ? AuthStore.maskApiKey(p.apiKey) : null,
|
|
61
|
-
baseUrl: p.baseUrl,
|
|
62
|
-
requiresApiKey: p.requiresApiKey,
|
|
63
|
-
}));
|
|
64
|
-
|
|
65
|
-
// Output sanitized JSON (API keys are already masked above)
|
|
66
|
-
ui.print(JSON.stringify(safeOutput, null, 2));
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Human-readable table output
|
|
71
|
-
ui.newLine();
|
|
72
|
-
ui.section('LLM Providers');
|
|
73
|
-
|
|
74
|
-
// Build table data
|
|
75
|
-
const tableData: Array<Record<string, string>> = [];
|
|
76
|
-
|
|
77
|
-
for (const provider of providerData) {
|
|
78
|
-
const statusIcon = provider.isConfigured ? ui.color('✓', 'green') : ui.dim('—');
|
|
79
|
-
const statusText = provider.isConfigured ? 'Configured' : 'Not configured';
|
|
80
|
-
|
|
81
|
-
let apiKeyDisplay: string;
|
|
82
|
-
if (provider.isConfigured && provider.apiKey) {
|
|
83
|
-
apiKeyDisplay = AuthStore.maskApiKey(provider.apiKey);
|
|
84
|
-
} else if (!provider.requiresApiKey) {
|
|
85
|
-
apiKeyDisplay = ui.dim('(not needed)');
|
|
86
|
-
} else if (provider.isConfigured) {
|
|
87
|
-
apiKeyDisplay = ui.dim('(from env)');
|
|
88
|
-
} else {
|
|
89
|
-
apiKeyDisplay = ui.dim('—');
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const modelDisplay = provider.isConfigured ? provider.model : ui.dim(provider.model);
|
|
93
|
-
const defaultDisplay = provider.isDefault ? ui.color('★', 'yellow') : '';
|
|
94
|
-
|
|
95
|
-
tableData.push({
|
|
96
|
-
provider: `${statusIcon} ${provider.displayName}`,
|
|
97
|
-
status: statusText,
|
|
98
|
-
apiKey: apiKeyDisplay,
|
|
99
|
-
model: modelDisplay,
|
|
100
|
-
default: defaultDisplay,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Display table
|
|
105
|
-
ui.table({
|
|
106
|
-
columns: [
|
|
107
|
-
{ key: 'provider', header: 'Provider', width: 25 },
|
|
108
|
-
{ key: 'status', header: 'Status', width: 15 },
|
|
109
|
-
{ key: 'apiKey', header: 'API Key', width: 20 },
|
|
110
|
-
{ key: 'model', header: 'Model', width: 30 },
|
|
111
|
-
{ key: 'default', header: 'Default', width: 8 },
|
|
112
|
-
],
|
|
113
|
-
data: tableData,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
ui.newLine();
|
|
117
|
-
|
|
118
|
-
// Show hints for unconfigured providers
|
|
119
|
-
const unconfigured = providerData.filter(p => !p.isConfigured);
|
|
120
|
-
if (unconfigured.length > 0) {
|
|
121
|
-
ui.print(ui.dim('To configure a provider, run `nimbus login`'));
|
|
122
|
-
ui.newLine();
|
|
123
|
-
|
|
124
|
-
ui.print(ui.dim('API key URLs:'));
|
|
125
|
-
for (const provider of unconfigured) {
|
|
126
|
-
if (provider.apiKeyUrl) {
|
|
127
|
-
ui.print(ui.dim(` ${provider.displayName}: ${provider.apiKeyUrl}`));
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
ui.newLine();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export default authListCommand;
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth Profile Commands
|
|
3
|
-
*
|
|
4
|
-
* CLI commands for managing authentication profiles and switching providers
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { AuthStore } from '../auth/store';
|
|
8
|
-
import { ui } from '../wizard/ui';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* List all configured providers
|
|
12
|
-
*/
|
|
13
|
-
async function authProfileListCommand(): Promise<void> {
|
|
14
|
-
ui.header('Auth Profiles');
|
|
15
|
-
|
|
16
|
-
const authStore = new AuthStore();
|
|
17
|
-
const status = authStore.getStatus();
|
|
18
|
-
|
|
19
|
-
if (!status.hasProviders) {
|
|
20
|
-
ui.warning('No providers configured. Run "nimbus login" to set up authentication.');
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
ui.table({
|
|
25
|
-
columns: [
|
|
26
|
-
{ key: 'name', header: 'Provider' },
|
|
27
|
-
{ key: 'model', header: 'Model' },
|
|
28
|
-
{ key: 'default', header: 'Default' },
|
|
29
|
-
{ key: 'validatedAt', header: 'Validated' },
|
|
30
|
-
],
|
|
31
|
-
data: status.providers.map(p => ({
|
|
32
|
-
name: p.name,
|
|
33
|
-
model: p.model || '-',
|
|
34
|
-
default: p.isDefault ? 'Yes' : '',
|
|
35
|
-
validatedAt: p.validatedAt ? new Date(p.validatedAt).toLocaleDateString() : '-',
|
|
36
|
-
})),
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Show the current default provider
|
|
42
|
-
*/
|
|
43
|
-
async function authProfileShowCommand(): Promise<void> {
|
|
44
|
-
ui.header('Current Auth Profile');
|
|
45
|
-
|
|
46
|
-
const authStore = new AuthStore();
|
|
47
|
-
const defaultProvider = authStore.getDefaultProvider();
|
|
48
|
-
|
|
49
|
-
if (!defaultProvider) {
|
|
50
|
-
ui.warning('No default provider set. Run "nimbus login" to configure.');
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const status = authStore.getStatus();
|
|
55
|
-
const providerInfo = status.providers.find(p => p.name === defaultProvider);
|
|
56
|
-
|
|
57
|
-
ui.print(` ${ui.color('Provider:', 'cyan')} ${defaultProvider}`);
|
|
58
|
-
if (providerInfo) {
|
|
59
|
-
ui.print(` ${ui.color('Model:', 'cyan')} ${providerInfo.model || '-'}`);
|
|
60
|
-
ui.print(
|
|
61
|
-
` ${ui.color('Validated:', 'cyan')} ${providerInfo.validatedAt ? new Date(providerInfo.validatedAt).toLocaleDateString() : '-'}`
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Switch the default provider
|
|
68
|
-
*/
|
|
69
|
-
async function authProfileSwitchCommand(provider: string): Promise<void> {
|
|
70
|
-
ui.header(`Switch Auth Profile`);
|
|
71
|
-
|
|
72
|
-
const authStore = new AuthStore();
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
authStore.setDefaultProvider(provider as any);
|
|
76
|
-
ui.success(`Default provider switched to "${provider}"`);
|
|
77
|
-
ui.info(`Persisted to ${authStore.getAuthPath()}`);
|
|
78
|
-
} catch (error: any) {
|
|
79
|
-
ui.error(error.message);
|
|
80
|
-
ui.info('Available providers:');
|
|
81
|
-
const status = authStore.getStatus();
|
|
82
|
-
status.providers.forEach(p => {
|
|
83
|
-
ui.print(` - ${p.name}${p.isDefault ? ' (current default)' : ''}`);
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Main auth-profile command router
|
|
90
|
-
*/
|
|
91
|
-
export async function authProfileCommand(subcommand: string, args: string[]): Promise<void> {
|
|
92
|
-
const positionalArgs: string[] = [];
|
|
93
|
-
|
|
94
|
-
for (let i = 0; i < args.length; i++) {
|
|
95
|
-
const arg = args[i];
|
|
96
|
-
if (!arg.startsWith('-')) {
|
|
97
|
-
positionalArgs.push(arg);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
switch (subcommand) {
|
|
102
|
-
case 'list':
|
|
103
|
-
case 'ls':
|
|
104
|
-
await authProfileListCommand();
|
|
105
|
-
break;
|
|
106
|
-
case 'show':
|
|
107
|
-
await authProfileShowCommand();
|
|
108
|
-
break;
|
|
109
|
-
case 'switch':
|
|
110
|
-
if (positionalArgs.length < 1) {
|
|
111
|
-
ui.error('Usage: nimbus auth-profile switch <provider>');
|
|
112
|
-
ui.info('Example: nimbus auth-profile switch openai');
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
await authProfileSwitchCommand(positionalArgs[0]);
|
|
116
|
-
break;
|
|
117
|
-
default:
|
|
118
|
-
ui.error(`Unknown auth-profile subcommand: ${subcommand || '(none)'}`);
|
|
119
|
-
ui.info('Available commands: list, show, switch <provider>');
|
|
120
|
-
}
|
|
121
|
-
}
|