@build-astron-co/nimbus 0.4.2 → 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/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 +6 -3
- 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/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/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/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 -609
- 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 -234
- 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
package/src/commands/status.ts
DELETED
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* nimbus status — Infrastructure Status Dashboard
|
|
3
|
-
*
|
|
4
|
-
* Runs concurrent checks against common DevOps CLIs and shows a dashboard
|
|
5
|
-
* of the current cloud/infra context.
|
|
6
|
-
*
|
|
7
|
-
* G18: New command added to the gap fix plan.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* nimbus status
|
|
11
|
-
* nimbus status --json
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { ui } from '../wizard';
|
|
15
|
-
|
|
16
|
-
/** Options for the status command. */
|
|
17
|
-
export interface StatusOptions {
|
|
18
|
-
/** Output as JSON instead of table. */
|
|
19
|
-
json?: boolean;
|
|
20
|
-
/** L3: Show full snapshot including LLM config and active profile. */
|
|
21
|
-
verbose?: boolean;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
interface StatusInfo {
|
|
25
|
-
k8sContext?: string;
|
|
26
|
-
tfWorkspace?: string;
|
|
27
|
-
awsAccount?: string;
|
|
28
|
-
awsRegion?: string;
|
|
29
|
-
gcpProject?: string;
|
|
30
|
-
lastDriftScan?: string;
|
|
31
|
-
// C2 enhancements
|
|
32
|
-
sessionCount?: number | string;
|
|
33
|
-
model?: string;
|
|
34
|
-
provider?: string;
|
|
35
|
-
nimbusMdSize?: number;
|
|
36
|
-
nimbusMdFound?: boolean;
|
|
37
|
-
dbSizeMB?: number;
|
|
38
|
-
// M1: Helm and pod health
|
|
39
|
-
helmFailedCount?: number;
|
|
40
|
-
helmTotalCount?: number;
|
|
41
|
-
unhealthyPodCount?: number;
|
|
42
|
-
errors: string[];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Run the nimbus status command.
|
|
47
|
-
* Checks k8s context, tf workspace, AWS identity, and GCP project concurrently.
|
|
48
|
-
*/
|
|
49
|
-
export async function statusCommand(options: StatusOptions = {}): Promise<void> {
|
|
50
|
-
const { execFileSync } = await import('node:child_process');
|
|
51
|
-
const { existsSync, statSync, readFileSync } = await import('node:fs');
|
|
52
|
-
const { join } = await import('node:path');
|
|
53
|
-
const { homedir } = await import('node:os');
|
|
54
|
-
|
|
55
|
-
const info: StatusInfo = { errors: [] };
|
|
56
|
-
|
|
57
|
-
const run = (cmd: string, args: string[]): string | undefined => {
|
|
58
|
-
try {
|
|
59
|
-
return execFileSync(cmd, args, {
|
|
60
|
-
encoding: 'utf-8',
|
|
61
|
-
timeout: 8000,
|
|
62
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
63
|
-
}).trim();
|
|
64
|
-
} catch {
|
|
65
|
-
return undefined;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// Run all checks concurrently (M1: add helm + pod health)
|
|
70
|
-
const [k8sCtx, tfWs, awsIdentityRaw, gcpProject, helmListRaw, podUnhealthyRaw] = await Promise.allSettled([
|
|
71
|
-
Promise.resolve(run('kubectl', ['config', 'current-context'])),
|
|
72
|
-
Promise.resolve(run('terraform', ['workspace', 'show'])),
|
|
73
|
-
Promise.resolve(run('aws', ['sts', 'get-caller-identity', '--output', 'json'])),
|
|
74
|
-
Promise.resolve(run('gcloud', ['config', 'get-value', 'project'])),
|
|
75
|
-
Promise.resolve(run('helm', ['list', '-A', '--output', 'json'])),
|
|
76
|
-
Promise.resolve(run('kubectl', ['get', 'pods', '-A', '--field-selector=status.phase!=Running', '--no-headers'])),
|
|
77
|
-
]);
|
|
78
|
-
|
|
79
|
-
if (k8sCtx.status === 'fulfilled' && k8sCtx.value) {
|
|
80
|
-
info.k8sContext = k8sCtx.value;
|
|
81
|
-
}
|
|
82
|
-
if (tfWs.status === 'fulfilled' && tfWs.value) {
|
|
83
|
-
info.tfWorkspace = tfWs.value;
|
|
84
|
-
}
|
|
85
|
-
if (awsIdentityRaw.status === 'fulfilled' && awsIdentityRaw.value) {
|
|
86
|
-
try {
|
|
87
|
-
const identity = JSON.parse(awsIdentityRaw.value);
|
|
88
|
-
info.awsAccount = identity.Account;
|
|
89
|
-
// Try to get region separately
|
|
90
|
-
const region = run('aws', ['configure', 'get', 'region']);
|
|
91
|
-
if (region) info.awsRegion = region;
|
|
92
|
-
} catch {
|
|
93
|
-
// Could not parse AWS identity
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (gcpProject.status === 'fulfilled' && gcpProject.value && gcpProject.value !== '(unset)') {
|
|
97
|
-
info.gcpProject = gcpProject.value;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// M1: Parse helm release health
|
|
101
|
-
if (helmListRaw.status === 'fulfilled' && helmListRaw.value) {
|
|
102
|
-
try {
|
|
103
|
-
const releases = JSON.parse(helmListRaw.value) as Array<{ status: string }>;
|
|
104
|
-
info.helmTotalCount = releases.length;
|
|
105
|
-
info.helmFailedCount = releases.filter(r => r.status !== 'deployed').length;
|
|
106
|
-
} catch { /* non-critical */ }
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// M1: Parse unhealthy pod count
|
|
110
|
-
if (podUnhealthyRaw.status === 'fulfilled' && podUnhealthyRaw.value) {
|
|
111
|
-
const lines = podUnhealthyRaw.value.trim().split('\n').filter(Boolean);
|
|
112
|
-
info.unhealthyPodCount = lines.length;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Check last drift scan from SQLite + session count
|
|
116
|
-
try {
|
|
117
|
-
const { getDb } = await import('../state/db');
|
|
118
|
-
const db = getDb();
|
|
119
|
-
const row = db.prepare(`
|
|
120
|
-
SELECT created_at FROM sessions
|
|
121
|
-
ORDER BY created_at DESC LIMIT 1
|
|
122
|
-
`).get() as { created_at?: string } | undefined;
|
|
123
|
-
if (row?.created_at) {
|
|
124
|
-
info.lastDriftScan = row.created_at;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// C2: Count sessions
|
|
128
|
-
const countRow = db.prepare('SELECT COUNT(*) as cnt FROM sessions').get() as { cnt?: number } | undefined;
|
|
129
|
-
info.sessionCount = countRow?.cnt ?? 0;
|
|
130
|
-
} catch {
|
|
131
|
-
// DB not available
|
|
132
|
-
info.sessionCount = 'N/A';
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// C2: Read model and provider from ~/.nimbus/config.json
|
|
136
|
-
const configJsonPath = join(homedir(), '.nimbus', 'config.json');
|
|
137
|
-
try {
|
|
138
|
-
if (existsSync(configJsonPath)) {
|
|
139
|
-
const configRaw = readFileSync(configJsonPath, 'utf-8');
|
|
140
|
-
const config = JSON.parse(configRaw) as Record<string, unknown>;
|
|
141
|
-
info.model = typeof config.model === 'string' ? config.model : 'claude-sonnet-4-6';
|
|
142
|
-
info.provider = typeof config.provider === 'string' ? config.provider : 'anthropic';
|
|
143
|
-
} else {
|
|
144
|
-
info.model = 'claude-sonnet-4-6';
|
|
145
|
-
info.provider = 'anthropic';
|
|
146
|
-
}
|
|
147
|
-
} catch {
|
|
148
|
-
info.model = 'claude-sonnet-4-6';
|
|
149
|
-
info.provider = 'anthropic';
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// C2: Check NIMBUS.md in cwd
|
|
153
|
-
const nimbusMdPaths = [
|
|
154
|
-
join(process.cwd(), 'NIMBUS.md'),
|
|
155
|
-
join(process.cwd(), '.nimbus', 'NIMBUS.md'),
|
|
156
|
-
];
|
|
157
|
-
for (const p of nimbusMdPaths) {
|
|
158
|
-
try {
|
|
159
|
-
if (existsSync(p)) {
|
|
160
|
-
const stat = statSync(p);
|
|
161
|
-
info.nimbusMdFound = true;
|
|
162
|
-
info.nimbusMdSize = stat.size;
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
} catch { /* skip */ }
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// C2: Get DB file size
|
|
169
|
-
const dbPath = join(homedir(), '.nimbus', 'nimbus.db');
|
|
170
|
-
try {
|
|
171
|
-
if (existsSync(dbPath)) {
|
|
172
|
-
const stat = statSync(dbPath);
|
|
173
|
-
info.dbSizeMB = Math.round((stat.size / (1024 * 1024)) * 10) / 10;
|
|
174
|
-
}
|
|
175
|
-
} catch { /* skip */ }
|
|
176
|
-
|
|
177
|
-
if (options.json) {
|
|
178
|
-
console.log(JSON.stringify(info, null, 2));
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Pretty-print dashboard
|
|
183
|
-
// Build session line
|
|
184
|
-
const sessionLine = typeof info.sessionCount === 'number'
|
|
185
|
-
? `${info.sessionCount} sessions`
|
|
186
|
-
: 'N/A';
|
|
187
|
-
|
|
188
|
-
// Build NIMBUS.md line
|
|
189
|
-
const nimbusMdLine = info.nimbusMdFound && info.nimbusMdSize !== undefined
|
|
190
|
-
? ` loaded (${info.nimbusMdSize >= 1024
|
|
191
|
-
? `${(info.nimbusMdSize / 1024).toFixed(1)}KB`
|
|
192
|
-
: `${info.nimbusMdSize}B`})`
|
|
193
|
-
: ' not found';
|
|
194
|
-
|
|
195
|
-
// Build DB size line
|
|
196
|
-
const dbLine = info.dbSizeMB !== undefined
|
|
197
|
-
? `~/.nimbus/nimbus.db (${info.dbSizeMB}MB)`
|
|
198
|
-
: '~/.nimbus/nimbus.db (not found)';
|
|
199
|
-
|
|
200
|
-
ui.newLine();
|
|
201
|
-
ui.box({
|
|
202
|
-
title: 'Nimbus Infrastructure Status',
|
|
203
|
-
content: [
|
|
204
|
-
'',
|
|
205
|
-
` Session: ${sessionLine}`,
|
|
206
|
-
` Model: ${info.model ?? 'claude-sonnet-4-6'}`,
|
|
207
|
-
` Provider: ${info.provider ?? 'anthropic'} \u2713`,
|
|
208
|
-
'',
|
|
209
|
-
' Infrastructure:',
|
|
210
|
-
info.k8sContext
|
|
211
|
-
? ` Kubernetes: context=${info.k8sContext}`
|
|
212
|
-
: ' Kubernetes: (not configured)',
|
|
213
|
-
info.tfWorkspace
|
|
214
|
-
? ` Terraform: workspace=${info.tfWorkspace} \u2713 initialized`
|
|
215
|
-
: ' Terraform: (not in a terraform directory)',
|
|
216
|
-
info.awsAccount
|
|
217
|
-
? ` AWS: account=${info.awsAccount}${info.awsRegion ? ` region=${info.awsRegion}` : ''}`
|
|
218
|
-
: ' AWS: (not configured)',
|
|
219
|
-
info.gcpProject
|
|
220
|
-
? ` GCP: project=${info.gcpProject}`
|
|
221
|
-
: '',
|
|
222
|
-
// M1: Helm release health
|
|
223
|
-
...(info.helmTotalCount !== undefined
|
|
224
|
-
? [
|
|
225
|
-
info.helmFailedCount && info.helmFailedCount > 0
|
|
226
|
-
? ` [!] ${info.helmFailedCount} Helm release(s) in failed state (${info.helmTotalCount} total)`
|
|
227
|
-
: ` Helm: ${info.helmTotalCount} release(s) deployed`,
|
|
228
|
-
]
|
|
229
|
-
: []),
|
|
230
|
-
// M1: Pod health warnings
|
|
231
|
-
...(info.unhealthyPodCount !== undefined && info.unhealthyPodCount > 0
|
|
232
|
-
? [` [!] ${info.unhealthyPodCount} pod(s) not running`]
|
|
233
|
-
: []),
|
|
234
|
-
'',
|
|
235
|
-
` NIMBUS.md:${nimbusMdLine}`,
|
|
236
|
-
` DB: ${dbLine}`,
|
|
237
|
-
'',
|
|
238
|
-
info.lastDriftScan
|
|
239
|
-
? ` Last session: ${new Date(info.lastDriftScan).toLocaleString()}`
|
|
240
|
-
: ' Last session: (none)',
|
|
241
|
-
'',
|
|
242
|
-
' Quick actions: nimbus plan | nimbus apply | nimbus logs',
|
|
243
|
-
'',
|
|
244
|
-
].filter(line => line !== undefined) as string[],
|
|
245
|
-
style: 'rounded',
|
|
246
|
-
borderColor: 'cyan',
|
|
247
|
-
padding: 0,
|
|
248
|
-
});
|
|
249
|
-
ui.newLine();
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export default statusCommand;
|
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Team Commands
|
|
3
|
-
* Team collaboration CLI commands
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { ui } from '../../wizard/ui';
|
|
7
|
-
import { teamClient } from '../../clients/enterprise-client';
|
|
8
|
-
import { getAuthStore } from '../../auth';
|
|
9
|
-
import type {
|
|
10
|
-
TeamCreateOptions,
|
|
11
|
-
TeamInviteOptions,
|
|
12
|
-
TeamMembersOptions,
|
|
13
|
-
TeamRemoveOptions,
|
|
14
|
-
TeamSwitchOptions,
|
|
15
|
-
TeamRole,
|
|
16
|
-
} from '../../types';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Get current user ID from auth store
|
|
20
|
-
*/
|
|
21
|
-
function getCurrentUserId(): string {
|
|
22
|
-
const authStore = getAuthStore();
|
|
23
|
-
const auth = authStore.load();
|
|
24
|
-
const userId = auth?.identity?.github?.username;
|
|
25
|
-
if (!userId) {
|
|
26
|
-
throw new Error('Not authenticated. Run `nimbus login` first.');
|
|
27
|
-
}
|
|
28
|
-
return userId;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Get current team ID from config or environment
|
|
33
|
-
*/
|
|
34
|
-
function getCurrentTeamId(): string | null {
|
|
35
|
-
return process.env.NIMBUS_TEAM_ID || null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Parse team create options
|
|
40
|
-
*/
|
|
41
|
-
export function parseTeamCreateOptions(args: string[]): TeamCreateOptions {
|
|
42
|
-
const options: TeamCreateOptions = {};
|
|
43
|
-
|
|
44
|
-
for (let i = 0; i < args.length; i++) {
|
|
45
|
-
const arg = args[i];
|
|
46
|
-
if (arg === '--non-interactive') {
|
|
47
|
-
options.nonInteractive = true;
|
|
48
|
-
} else if (!arg.startsWith('-') && !options.name) {
|
|
49
|
-
options.name = arg;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return options;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Parse team invite options
|
|
58
|
-
*/
|
|
59
|
-
export function parseTeamInviteOptions(args: string[]): TeamInviteOptions {
|
|
60
|
-
const options: TeamInviteOptions = {};
|
|
61
|
-
|
|
62
|
-
for (let i = 0; i < args.length; i++) {
|
|
63
|
-
const arg = args[i];
|
|
64
|
-
if (arg === '--role' && args[i + 1]) {
|
|
65
|
-
options.role = args[++i] as TeamRole;
|
|
66
|
-
} else if (arg === '--non-interactive') {
|
|
67
|
-
options.nonInteractive = true;
|
|
68
|
-
} else if (!arg.startsWith('-') && !options.email) {
|
|
69
|
-
options.email = arg;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return options;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Parse team members options
|
|
78
|
-
*/
|
|
79
|
-
export function parseTeamMembersOptions(args: string[]): TeamMembersOptions {
|
|
80
|
-
const options: TeamMembersOptions = {};
|
|
81
|
-
|
|
82
|
-
for (let i = 0; i < args.length; i++) {
|
|
83
|
-
const arg = args[i];
|
|
84
|
-
if (arg === '--json') {
|
|
85
|
-
options.json = true;
|
|
86
|
-
} else if (arg === '--non-interactive') {
|
|
87
|
-
options.nonInteractive = true;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return options;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Parse team remove options
|
|
96
|
-
*/
|
|
97
|
-
export function parseTeamRemoveOptions(args: string[]): TeamRemoveOptions {
|
|
98
|
-
const options: TeamRemoveOptions = {};
|
|
99
|
-
|
|
100
|
-
for (let i = 0; i < args.length; i++) {
|
|
101
|
-
const arg = args[i];
|
|
102
|
-
if (arg === '--force' || arg === '-f') {
|
|
103
|
-
options.force = true;
|
|
104
|
-
} else if (arg === '--non-interactive') {
|
|
105
|
-
options.nonInteractive = true;
|
|
106
|
-
} else if (!arg.startsWith('-') && !options.email) {
|
|
107
|
-
options.email = arg;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return options;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Parse team switch options
|
|
116
|
-
*/
|
|
117
|
-
export function parseTeamSwitchOptions(args: string[]): TeamSwitchOptions {
|
|
118
|
-
const options: TeamSwitchOptions = {};
|
|
119
|
-
|
|
120
|
-
for (let i = 0; i < args.length; i++) {
|
|
121
|
-
const arg = args[i];
|
|
122
|
-
if (arg === '--non-interactive') {
|
|
123
|
-
options.nonInteractive = true;
|
|
124
|
-
} else if (!arg.startsWith('-') && !options.teamId) {
|
|
125
|
-
options.teamId = arg;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return options;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Team create command
|
|
134
|
-
*/
|
|
135
|
-
export async function teamCreateCommand(options: TeamCreateOptions): Promise<void> {
|
|
136
|
-
try {
|
|
137
|
-
const name = options.name;
|
|
138
|
-
if (!name) {
|
|
139
|
-
ui.error('Team name is required');
|
|
140
|
-
ui.info('Usage: nimbus team create <name>');
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const userId = getCurrentUserId();
|
|
145
|
-
|
|
146
|
-
ui.startSpinner({ message: 'Creating team...' });
|
|
147
|
-
const team = await teamClient.createTeam({ name, ownerId: userId });
|
|
148
|
-
ui.stopSpinnerSuccess(`Team "${team.name}" created`);
|
|
149
|
-
|
|
150
|
-
ui.newLine();
|
|
151
|
-
ui.info(`Team ID: ${team.id}`);
|
|
152
|
-
ui.info(`To use this team, run: nimbus team switch ${team.id}`);
|
|
153
|
-
ui.info(`Or set environment variable: export NIMBUS_TEAM_ID=${team.id}`);
|
|
154
|
-
} catch (error: any) {
|
|
155
|
-
ui.stopSpinnerFail('Failed to create team');
|
|
156
|
-
ui.error(error.message);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Team invite command
|
|
162
|
-
*/
|
|
163
|
-
export async function teamInviteCommand(options: TeamInviteOptions): Promise<void> {
|
|
164
|
-
try {
|
|
165
|
-
const email = options.email;
|
|
166
|
-
if (!email) {
|
|
167
|
-
ui.error('Email is required');
|
|
168
|
-
ui.info('Usage: nimbus team invite <email> [--role member|admin|viewer]');
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const teamId = getCurrentTeamId();
|
|
173
|
-
if (!teamId) {
|
|
174
|
-
ui.error('No team selected. Run `nimbus team switch <team-id>` first.');
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
ui.startSpinner({ message: `Inviting ${email}...` });
|
|
179
|
-
const member = await teamClient.inviteMember(teamId, {
|
|
180
|
-
email,
|
|
181
|
-
role: options.role || 'member',
|
|
182
|
-
});
|
|
183
|
-
ui.stopSpinnerSuccess(`Invited ${email} as ${member.role}`);
|
|
184
|
-
} catch (error: any) {
|
|
185
|
-
ui.stopSpinnerFail('Failed to invite member');
|
|
186
|
-
ui.error(error.message);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Team members command
|
|
192
|
-
*/
|
|
193
|
-
export async function teamMembersCommand(options: TeamMembersOptions): Promise<void> {
|
|
194
|
-
try {
|
|
195
|
-
const teamId = getCurrentTeamId();
|
|
196
|
-
if (!teamId) {
|
|
197
|
-
ui.error('No team selected. Run `nimbus team switch <team-id>` first.');
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
ui.startSpinner({ message: 'Fetching members...' });
|
|
202
|
-
const members = await teamClient.listMembers(teamId);
|
|
203
|
-
ui.stopSpinnerSuccess(`Found ${members.length} members`);
|
|
204
|
-
|
|
205
|
-
if (options.json) {
|
|
206
|
-
console.log(JSON.stringify(members, null, 2));
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
ui.newLine();
|
|
211
|
-
ui.table({
|
|
212
|
-
columns: [
|
|
213
|
-
{ key: 'email', header: 'Email' },
|
|
214
|
-
{ key: 'role', header: 'Role' },
|
|
215
|
-
{ key: 'joinedAt', header: 'Joined' },
|
|
216
|
-
],
|
|
217
|
-
data: members.map(m => ({
|
|
218
|
-
email: m.user?.email || m.userId,
|
|
219
|
-
role: m.role,
|
|
220
|
-
joinedAt: new Date(m.joinedAt).toLocaleDateString(),
|
|
221
|
-
})),
|
|
222
|
-
});
|
|
223
|
-
} catch (error: any) {
|
|
224
|
-
ui.stopSpinnerFail('Failed to list members');
|
|
225
|
-
ui.error(error.message);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Team remove command
|
|
231
|
-
*/
|
|
232
|
-
export async function teamRemoveCommand(options: TeamRemoveOptions): Promise<void> {
|
|
233
|
-
try {
|
|
234
|
-
const email = options.email;
|
|
235
|
-
if (!email) {
|
|
236
|
-
ui.error('Email is required');
|
|
237
|
-
ui.info('Usage: nimbus team remove <email>');
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
const teamId = getCurrentTeamId();
|
|
242
|
-
if (!teamId) {
|
|
243
|
-
ui.error('No team selected. Run `nimbus team switch <team-id>` first.');
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// First, find the user ID by email from members list
|
|
248
|
-
const members = await teamClient.listMembers(teamId);
|
|
249
|
-
const member = members.find(m => m.user?.email === email);
|
|
250
|
-
|
|
251
|
-
if (!member) {
|
|
252
|
-
ui.error(`Member with email ${email} not found`);
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
ui.startSpinner({ message: `Removing ${email}...` });
|
|
257
|
-
await teamClient.removeMember(teamId, member.userId);
|
|
258
|
-
ui.stopSpinnerSuccess(`Removed ${email} from team`);
|
|
259
|
-
} catch (error: any) {
|
|
260
|
-
ui.stopSpinnerFail('Failed to remove member');
|
|
261
|
-
ui.error(error.message);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Team switch command
|
|
267
|
-
*/
|
|
268
|
-
export async function teamSwitchCommand(options: TeamSwitchOptions): Promise<void> {
|
|
269
|
-
try {
|
|
270
|
-
const userId = getCurrentUserId();
|
|
271
|
-
|
|
272
|
-
// If no team ID provided, list teams for selection
|
|
273
|
-
if (!options.teamId) {
|
|
274
|
-
ui.startSpinner({ message: 'Fetching teams...' });
|
|
275
|
-
const teams = await teamClient.listTeams(userId);
|
|
276
|
-
ui.stopSpinnerSuccess(`Found ${teams.length} teams`);
|
|
277
|
-
|
|
278
|
-
if (teams.length === 0) {
|
|
279
|
-
ui.info('No teams found. Create one with `nimbus team create <name>`');
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
ui.newLine();
|
|
284
|
-
ui.info('Available teams:');
|
|
285
|
-
for (const team of teams) {
|
|
286
|
-
ui.print(` ${team.id} - ${team.name} (${team.plan})`);
|
|
287
|
-
}
|
|
288
|
-
ui.newLine();
|
|
289
|
-
ui.info('To switch: nimbus team switch <team-id>');
|
|
290
|
-
ui.info('Or set: export NIMBUS_TEAM_ID=<team-id>');
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Verify team exists and user has access
|
|
295
|
-
ui.startSpinner({ message: 'Switching team...' });
|
|
296
|
-
const team = await teamClient.getTeam(options.teamId);
|
|
297
|
-
if (!team) {
|
|
298
|
-
ui.stopSpinnerFail('Team not found');
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
ui.stopSpinnerSuccess(`Switched to team "${team.name}"`);
|
|
303
|
-
ui.newLine();
|
|
304
|
-
ui.info(`Set this environment variable to persist:`);
|
|
305
|
-
ui.print(` export NIMBUS_TEAM_ID=${team.id}`);
|
|
306
|
-
} catch (error: any) {
|
|
307
|
-
ui.stopSpinnerFail('Failed to switch team');
|
|
308
|
-
ui.error(error.message);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Main team command dispatcher
|
|
314
|
-
*/
|
|
315
|
-
export async function teamCommand(subcommand: string, args: string[]): Promise<void> {
|
|
316
|
-
switch (subcommand) {
|
|
317
|
-
case 'create':
|
|
318
|
-
await teamCreateCommand(parseTeamCreateOptions(args));
|
|
319
|
-
break;
|
|
320
|
-
case 'invite':
|
|
321
|
-
await teamInviteCommand(parseTeamInviteOptions(args));
|
|
322
|
-
break;
|
|
323
|
-
case 'members':
|
|
324
|
-
await teamMembersCommand(parseTeamMembersOptions(args));
|
|
325
|
-
break;
|
|
326
|
-
case 'remove':
|
|
327
|
-
await teamRemoveCommand(parseTeamRemoveOptions(args));
|
|
328
|
-
break;
|
|
329
|
-
case 'switch':
|
|
330
|
-
await teamSwitchCommand(parseTeamSwitchOptions(args));
|
|
331
|
-
break;
|
|
332
|
-
case 'list':
|
|
333
|
-
await teamSwitchCommand(parseTeamSwitchOptions([])); // List mode
|
|
334
|
-
break;
|
|
335
|
-
default:
|
|
336
|
-
ui.error(`Unknown team command: ${subcommand}`);
|
|
337
|
-
ui.newLine();
|
|
338
|
-
ui.info('Available team commands:');
|
|
339
|
-
ui.print(' nimbus team create <name> - Create a new team');
|
|
340
|
-
ui.print(' nimbus team invite <email> - Invite a member');
|
|
341
|
-
ui.print(' nimbus team members - List team members');
|
|
342
|
-
ui.print(' nimbus team remove <email> - Remove a member');
|
|
343
|
-
ui.print(' nimbus team switch [team-id] - Switch to a team');
|
|
344
|
-
ui.print(' nimbus team list - List your teams');
|
|
345
|
-
}
|
|
346
|
-
}
|