@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
package/src/plugins/types.ts
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Nimbus Plugin System — Type Definitions
|
|
3
|
-
*
|
|
4
|
-
* These interfaces define the contract that every Nimbus plugin must satisfy.
|
|
5
|
-
* A plugin is a directory installed under ~/.nimbus/plugins/ that contains a
|
|
6
|
-
* `nimbus-plugin.json` manifest and a JavaScript/TypeScript entry point.
|
|
7
|
-
*
|
|
8
|
-
* Plugins may contribute:
|
|
9
|
-
* - Custom tools that are injected into the agent's ToolRegistry at startup.
|
|
10
|
-
* - Custom LLM provider factories that are registered with the LLM router.
|
|
11
|
-
*
|
|
12
|
-
* Lifecycle:
|
|
13
|
-
* 1. {@link PluginLoader.discover} scans ~/.nimbus/plugins/ for manifests.
|
|
14
|
-
* 2. {@link PluginLoader.load} imports the `main` entry point and validates
|
|
15
|
-
* that it default-exports a {@link NimbusPlugin}.
|
|
16
|
-
* 3. If defined, {@link NimbusPlugin.onLoad} is awaited before the plugin is
|
|
17
|
-
* considered active.
|
|
18
|
-
* 4. On process exit, {@link PluginManager.shutdown} calls
|
|
19
|
-
* {@link NimbusPlugin.onUnload} for every active plugin.
|
|
20
|
-
*
|
|
21
|
-
* @module plugins/types
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Plugin Tool Definition
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* The subset of permission tiers that plugins may request.
|
|
30
|
-
*
|
|
31
|
-
* The `blocked` tier is intentionally excluded — plugins cannot declare
|
|
32
|
-
* a tool as permanently blocked; that is a host-level policy decision.
|
|
33
|
-
*/
|
|
34
|
-
export type PluginPermissionTier = 'auto_allow' | 'ask_once' | 'always_ask';
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Describes a single tool contributed by a plugin.
|
|
38
|
-
*
|
|
39
|
-
* The shape intentionally mirrors {@link import('../tools/schemas/types').ToolDefinition}
|
|
40
|
-
* but keeps the `inputSchema` as a plain `Record<string, unknown>` JSON Schema
|
|
41
|
-
* object rather than a Zod schema, so that plugins written in plain JavaScript
|
|
42
|
-
* do not need a Zod dependency. The manager converts this to a full
|
|
43
|
-
* {@link import('../tools/schemas/types').ToolDefinition} when registering.
|
|
44
|
-
*/
|
|
45
|
-
export interface PluginToolDefinition {
|
|
46
|
-
/**
|
|
47
|
-
* Unique snake_case identifier for this tool (e.g. `'my_plugin_fetch'`).
|
|
48
|
-
* Must not collide with any built-in tool name.
|
|
49
|
-
*/
|
|
50
|
-
name: string;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Natural-language description surfaced to the LLM so it knows when
|
|
54
|
-
* and how to invoke this tool.
|
|
55
|
-
*/
|
|
56
|
-
description: string;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* JSON Schema object that describes the tool's expected input.
|
|
60
|
-
* Must have `type: 'object'` at the top level.
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```json
|
|
64
|
-
* {
|
|
65
|
-
* "type": "object",
|
|
66
|
-
* "properties": { "url": { "type": "string" } },
|
|
67
|
-
* "required": ["url"]
|
|
68
|
-
* }
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
inputSchema: Record<string, unknown>;
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Which permission tier this tool belongs to. Determines whether the
|
|
75
|
-
* user is prompted before execution.
|
|
76
|
-
*/
|
|
77
|
-
permissionTier: PluginPermissionTier;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Execute the tool with the caller-supplied (already JSON-parsed) input.
|
|
81
|
-
*
|
|
82
|
-
* Implementations should catch their own errors and surface them via the
|
|
83
|
-
* return value rather than throwing, so that the agentic loop can report
|
|
84
|
-
* failures back to the LLM gracefully.
|
|
85
|
-
*
|
|
86
|
-
* @param input - The raw (unvalidated) input object forwarded by the engine.
|
|
87
|
-
* @returns A promise that resolves to a result object.
|
|
88
|
-
*/
|
|
89
|
-
execute: (input: unknown) => Promise<{ success: boolean; output: string }>;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
// Plugin Provider Definition
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Describes a custom LLM provider contributed by a plugin.
|
|
98
|
-
*
|
|
99
|
-
* The `factory` function is called lazily the first time the provider is
|
|
100
|
-
* selected by the router. It must return an object that satisfies the
|
|
101
|
-
* {@link import('../llm/types').LLMProvider} interface, though the type is
|
|
102
|
-
* declared as `unknown` here to keep plugins free of an explicit dependency
|
|
103
|
-
* on the internal LLM types module.
|
|
104
|
-
*/
|
|
105
|
-
export interface PluginProviderDefinition {
|
|
106
|
-
/**
|
|
107
|
-
* Internal identifier used to route requests (e.g. `'my-custom-llm'`).
|
|
108
|
-
* Must be unique across all loaded plugins and built-in providers.
|
|
109
|
-
*/
|
|
110
|
-
name: string;
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Human-readable label shown in CLI output and settings UIs
|
|
114
|
-
* (e.g. `'My Custom LLM Provider'`).
|
|
115
|
-
*/
|
|
116
|
-
displayName: string;
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Async factory that constructs and returns a configured
|
|
120
|
-
* {@link import('../llm/types').LLMProvider} instance.
|
|
121
|
-
*
|
|
122
|
-
* The factory is responsible for reading any required configuration
|
|
123
|
-
* (API keys, base URLs, etc.) from environment variables or the
|
|
124
|
-
* filesystem.
|
|
125
|
-
*
|
|
126
|
-
* @returns A promise resolving to an LLMProvider-compatible object.
|
|
127
|
-
*/
|
|
128
|
-
factory: () => Promise<unknown>;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
// Plugin Interface
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* The primary contract that a Nimbus plugin must satisfy.
|
|
137
|
-
*
|
|
138
|
-
* Every plugin's `main` entry point must default-export an object that
|
|
139
|
-
* implements this interface (or a class instance thereof).
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ```ts
|
|
143
|
-
* // ~/.nimbus/plugins/my-plugin/index.ts
|
|
144
|
-
* import type { NimbusPlugin } from 'nimbus/plugins';
|
|
145
|
-
*
|
|
146
|
-
* const plugin: NimbusPlugin = {
|
|
147
|
-
* name: 'my-plugin',
|
|
148
|
-
* version: '1.0.0',
|
|
149
|
-
* description: 'Adds a custom HTTP fetch tool.',
|
|
150
|
-
* tools: [myFetchTool],
|
|
151
|
-
* async onLoad() {
|
|
152
|
-
* console.error('[my-plugin] loaded');
|
|
153
|
-
* },
|
|
154
|
-
* };
|
|
155
|
-
*
|
|
156
|
-
* export default plugin;
|
|
157
|
-
* ```
|
|
158
|
-
*/
|
|
159
|
-
export interface NimbusPlugin {
|
|
160
|
-
/**
|
|
161
|
-
* Unique plugin identifier. Should match the directory name and the
|
|
162
|
-
* `name` field in `nimbus-plugin.json`.
|
|
163
|
-
*/
|
|
164
|
-
name: string;
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* SemVer version string (e.g. `'1.2.3'`). Used for display and
|
|
168
|
-
* compatibility checks.
|
|
169
|
-
*/
|
|
170
|
-
version: string;
|
|
171
|
-
|
|
172
|
-
/** Optional human-readable summary of what the plugin does. */
|
|
173
|
-
description?: string;
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Custom tools to register into the application-wide tool registry.
|
|
177
|
-
* Registered after {@link onLoad} resolves successfully.
|
|
178
|
-
*/
|
|
179
|
-
tools?: PluginToolDefinition[];
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Custom LLM provider factories to register with the LLM router.
|
|
183
|
-
* Registered after {@link onLoad} resolves successfully.
|
|
184
|
-
*/
|
|
185
|
-
providers?: PluginProviderDefinition[];
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Lifecycle hook called immediately after the plugin module is imported
|
|
189
|
-
* and before its tools/providers are registered. Use this for one-time
|
|
190
|
-
* initialisation (connecting to external services, reading config, etc.).
|
|
191
|
-
*
|
|
192
|
-
* If this function throws or rejects, the plugin is considered failed and
|
|
193
|
-
* will not be registered.
|
|
194
|
-
*/
|
|
195
|
-
onLoad?: () => Promise<void>;
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Lifecycle hook called when Nimbus is shutting down. Use this to
|
|
199
|
-
* release resources (close connections, flush buffers, etc.).
|
|
200
|
-
*
|
|
201
|
-
* Errors thrown here are logged but do not interrupt the shutdown
|
|
202
|
-
* sequence.
|
|
203
|
-
*/
|
|
204
|
-
onUnload?: () => Promise<void>;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// ---------------------------------------------------------------------------
|
|
208
|
-
// Plugin Manifest
|
|
209
|
-
// ---------------------------------------------------------------------------
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Shape of the `nimbus-plugin.json` manifest file that every plugin
|
|
213
|
-
* directory must contain.
|
|
214
|
-
*
|
|
215
|
-
* The loader reads this file first to obtain the `main` entry-point path
|
|
216
|
-
* before dynamically importing the module.
|
|
217
|
-
*
|
|
218
|
-
* @example
|
|
219
|
-
* ```json
|
|
220
|
-
* {
|
|
221
|
-
* "name": "my-plugin",
|
|
222
|
-
* "version": "1.0.0",
|
|
223
|
-
* "description": "My custom Nimbus plugin.",
|
|
224
|
-
* "main": "dist/index.js"
|
|
225
|
-
* }
|
|
226
|
-
* ```
|
|
227
|
-
*/
|
|
228
|
-
export interface PluginManifest {
|
|
229
|
-
/**
|
|
230
|
-
* Plugin name. Should be a lowercase, hyphen-separated identifier and
|
|
231
|
-
* must match the `name` field on the exported {@link NimbusPlugin}.
|
|
232
|
-
*/
|
|
233
|
-
name: string;
|
|
234
|
-
|
|
235
|
-
/** SemVer version string (e.g. `'1.0.0'`). */
|
|
236
|
-
version: string;
|
|
237
|
-
|
|
238
|
-
/** Optional human-readable description. */
|
|
239
|
-
description?: string;
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Relative path (from the plugin directory) to the JavaScript or
|
|
243
|
-
* TypeScript entry point that default-exports a {@link NimbusPlugin}.
|
|
244
|
-
*
|
|
245
|
-
* @example `"dist/index.js"` or `"index.ts"`
|
|
246
|
-
*/
|
|
247
|
-
main: string;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// ---------------------------------------------------------------------------
|
|
251
|
-
// Runtime Plugin Record
|
|
252
|
-
// ---------------------------------------------------------------------------
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Internal record that pairs a loaded plugin with the filesystem path it
|
|
256
|
-
* was loaded from. Used by {@link import('./manager').PluginManager} to
|
|
257
|
-
* track active plugins and surface diagnostic information.
|
|
258
|
-
*/
|
|
259
|
-
export interface LoadedPlugin {
|
|
260
|
-
/** The instantiated plugin object. */
|
|
261
|
-
plugin: NimbusPlugin;
|
|
262
|
-
|
|
263
|
-
/** Absolute path to the plugin directory on disk. */
|
|
264
|
-
pluginDir: string;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// ---------------------------------------------------------------------------
|
|
268
|
-
// Plugin Load Error
|
|
269
|
-
// ---------------------------------------------------------------------------
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Describes a plugin that failed to load, returned in the errors array
|
|
273
|
-
* from {@link import('./loader').PluginLoader.loadAll}.
|
|
274
|
-
*/
|
|
275
|
-
export interface PluginLoadError {
|
|
276
|
-
/** Absolute path of the plugin directory that failed. */
|
|
277
|
-
pluginDir: string;
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Human-readable reason for the failure (manifest parse error,
|
|
281
|
-
* missing main file, missing `name` field, `onLoad` rejection, etc.).
|
|
282
|
-
*/
|
|
283
|
-
reason: string;
|
|
284
|
-
}
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CI/CD Scanner
|
|
3
|
-
*
|
|
4
|
-
* Detects CI/CD platforms and workflows in a project
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import type { Scanner, ScanResult, ScanOptions, CICDInfo, ConfidenceLevel } from './types';
|
|
10
|
-
|
|
11
|
-
interface CICDPattern {
|
|
12
|
-
name: string;
|
|
13
|
-
displayName: string;
|
|
14
|
-
configPaths: string[];
|
|
15
|
-
workflowPattern?: RegExp;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const CICD_PATTERNS: CICDPattern[] = [
|
|
19
|
-
{
|
|
20
|
-
name: 'github-actions',
|
|
21
|
-
displayName: 'GitHub Actions',
|
|
22
|
-
configPaths: ['.github/workflows'],
|
|
23
|
-
workflowPattern: /\.ya?ml$/,
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'gitlab-ci',
|
|
27
|
-
displayName: 'GitLab CI',
|
|
28
|
-
configPaths: ['.gitlab-ci.yml', '.gitlab-ci.yaml'],
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: 'jenkins',
|
|
32
|
-
displayName: 'Jenkins',
|
|
33
|
-
configPaths: ['Jenkinsfile', 'jenkins/Jenkinsfile', '.jenkins'],
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'circleci',
|
|
37
|
-
displayName: 'CircleCI',
|
|
38
|
-
configPaths: ['.circleci/config.yml', '.circleci/config.yaml'],
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
name: 'travis-ci',
|
|
42
|
-
displayName: 'Travis CI',
|
|
43
|
-
configPaths: ['.travis.yml', '.travis.yaml'],
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: 'azure-pipelines',
|
|
47
|
-
displayName: 'Azure Pipelines',
|
|
48
|
-
configPaths: ['azure-pipelines.yml', 'azure-pipelines.yaml', '.azure-pipelines'],
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
name: 'bitbucket-pipelines',
|
|
52
|
-
displayName: 'Bitbucket Pipelines',
|
|
53
|
-
configPaths: ['bitbucket-pipelines.yml', 'bitbucket-pipelines.yaml'],
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'drone',
|
|
57
|
-
displayName: 'Drone CI',
|
|
58
|
-
configPaths: ['.drone.yml', '.drone.yaml'],
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'buildkite',
|
|
62
|
-
displayName: 'Buildkite',
|
|
63
|
-
configPaths: ['.buildkite/pipeline.yml', '.buildkite/pipeline.yaml', 'buildkite.yml'],
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'teamcity',
|
|
67
|
-
displayName: 'TeamCity',
|
|
68
|
-
configPaths: ['.teamcity'],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: 'concourse',
|
|
72
|
-
displayName: 'Concourse CI',
|
|
73
|
-
configPaths: ['ci/pipeline.yml', 'ci/pipeline.yaml', 'concourse.yml'],
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
name: 'codebuild',
|
|
77
|
-
displayName: 'AWS CodeBuild',
|
|
78
|
-
configPaths: ['buildspec.yml', 'buildspec.yaml'],
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
name: 'cloudbuild',
|
|
82
|
-
displayName: 'Google Cloud Build',
|
|
83
|
-
configPaths: ['cloudbuild.yaml', 'cloudbuild.yml'],
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
name: 'tekton',
|
|
87
|
-
displayName: 'Tekton',
|
|
88
|
-
configPaths: ['.tekton', 'tekton'],
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
name: 'argo-workflows',
|
|
92
|
-
displayName: 'Argo Workflows',
|
|
93
|
-
configPaths: ['.argo'],
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
name: 'woodpecker',
|
|
97
|
-
displayName: 'Woodpecker CI',
|
|
98
|
-
configPaths: ['.woodpecker.yml', '.woodpecker.yaml', '.woodpecker'],
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
name: 'earthly',
|
|
102
|
-
displayName: 'Earthly',
|
|
103
|
-
configPaths: ['Earthfile'],
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
name: 'dagger',
|
|
107
|
-
displayName: 'Dagger',
|
|
108
|
-
configPaths: ['dagger.json', 'dagger'],
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
name: 'taskfile',
|
|
112
|
-
displayName: 'Task (Taskfile)',
|
|
113
|
-
configPaths: ['Taskfile.yml', 'Taskfile.yaml', 'Taskfile.dist.yml'],
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
name: 'makefile',
|
|
117
|
-
displayName: 'Make',
|
|
118
|
-
configPaths: ['Makefile', 'makefile', 'GNUmakefile'],
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
name: 'justfile',
|
|
122
|
-
displayName: 'Just',
|
|
123
|
-
configPaths: ['justfile', 'Justfile', '.justfile'],
|
|
124
|
-
},
|
|
125
|
-
];
|
|
126
|
-
|
|
127
|
-
export class CICDScanner implements Scanner {
|
|
128
|
-
name = 'cicd';
|
|
129
|
-
|
|
130
|
-
async scan(cwd: string, _options?: ScanOptions): Promise<ScanResult> {
|
|
131
|
-
const cicd = await this.detectCICD(cwd);
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
detected: cicd.length > 0,
|
|
135
|
-
confidence: cicd.length > 0 ? cicd[0].confidence : 'low',
|
|
136
|
-
details: {
|
|
137
|
-
cicd,
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
async detectCICD(cwd: string): Promise<CICDInfo[]> {
|
|
143
|
-
const detected: CICDInfo[] = [];
|
|
144
|
-
|
|
145
|
-
for (const pattern of CICD_PATTERNS) {
|
|
146
|
-
const result = await this.detectCICDPlatform(cwd, pattern);
|
|
147
|
-
if (result) {
|
|
148
|
-
detected.push(result);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Sort by confidence, then prioritize CI/CD over build tools
|
|
153
|
-
return detected.sort((a, b) => {
|
|
154
|
-
const order: Record<ConfidenceLevel, number> = { high: 3, medium: 2, low: 1 };
|
|
155
|
-
const confDiff = order[b.confidence] - order[a.confidence];
|
|
156
|
-
if (confDiff !== 0) {
|
|
157
|
-
return confDiff;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Prioritize CI/CD platforms over local build tools
|
|
161
|
-
const buildTools = ['makefile', 'taskfile', 'justfile'];
|
|
162
|
-
const aIsBuildTool = buildTools.includes(a.platform);
|
|
163
|
-
const bIsBuildTool = buildTools.includes(b.platform);
|
|
164
|
-
if (aIsBuildTool && !bIsBuildTool) {
|
|
165
|
-
return 1;
|
|
166
|
-
}
|
|
167
|
-
if (!aIsBuildTool && bIsBuildTool) {
|
|
168
|
-
return -1;
|
|
169
|
-
}
|
|
170
|
-
return 0;
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
private async detectCICDPlatform(cwd: string, pattern: CICDPattern): Promise<CICDInfo | null> {
|
|
175
|
-
let confidence: ConfidenceLevel = 'low';
|
|
176
|
-
const workflows: string[] = [];
|
|
177
|
-
|
|
178
|
-
for (const configPath of pattern.configPaths) {
|
|
179
|
-
const fullPath = path.join(cwd, configPath);
|
|
180
|
-
|
|
181
|
-
if (fs.existsSync(fullPath)) {
|
|
182
|
-
const stat = fs.statSync(fullPath);
|
|
183
|
-
|
|
184
|
-
if (stat.isDirectory()) {
|
|
185
|
-
// It's a directory, look for workflow files
|
|
186
|
-
try {
|
|
187
|
-
const files = fs.readdirSync(fullPath);
|
|
188
|
-
for (const file of files) {
|
|
189
|
-
if (pattern.workflowPattern) {
|
|
190
|
-
if (pattern.workflowPattern.test(file)) {
|
|
191
|
-
workflows.push(path.join(configPath, file));
|
|
192
|
-
confidence = 'high';
|
|
193
|
-
}
|
|
194
|
-
} else {
|
|
195
|
-
workflows.push(path.join(configPath, file));
|
|
196
|
-
confidence = 'high';
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
} catch {
|
|
200
|
-
// Ignore read errors
|
|
201
|
-
}
|
|
202
|
-
} else {
|
|
203
|
-
// It's a file
|
|
204
|
-
workflows.push(configPath);
|
|
205
|
-
confidence = 'high';
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (workflows.length === 0) {
|
|
211
|
-
return null;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
return {
|
|
215
|
-
platform: pattern.name,
|
|
216
|
-
workflows,
|
|
217
|
-
confidence,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Get all CI/CD workflow files
|
|
223
|
-
*/
|
|
224
|
-
async getCICDFiles(cwd: string): Promise<string[]> {
|
|
225
|
-
const files: string[] = [];
|
|
226
|
-
const cicdInfo = await this.detectCICD(cwd);
|
|
227
|
-
|
|
228
|
-
for (const info of cicdInfo) {
|
|
229
|
-
files.push(...info.workflows);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return [...new Set(files)];
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Get the primary CI/CD platform
|
|
237
|
-
*/
|
|
238
|
-
async getPrimaryCICDPlatform(cwd: string): Promise<string | null> {
|
|
239
|
-
const cicdInfo = await this.detectCICD(cwd);
|
|
240
|
-
|
|
241
|
-
// Filter out local build tools
|
|
242
|
-
const buildTools = ['makefile', 'taskfile', 'justfile'];
|
|
243
|
-
const platforms = cicdInfo.filter(info => !buildTools.includes(info.platform));
|
|
244
|
-
|
|
245
|
-
if (platforms.length === 0) {
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return platforms[0].platform;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Create CI/CD scanner instance
|
|
255
|
-
*/
|
|
256
|
-
export function createCICDScanner(): CICDScanner {
|
|
257
|
-
return new CICDScanner();
|
|
258
|
-
}
|