@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,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for embedded tool operation classes:
|
|
3
|
-
* - src/tools/file-ops.ts – FileSystemOperations
|
|
4
|
-
* - src/tools/git-ops.ts – GitOperations
|
|
5
|
-
*
|
|
6
|
-
* These tests verify that the classes can be instantiated and that their
|
|
7
|
-
* fundamental read/exists operations work against the real filesystem.
|
|
8
|
-
* Git network operations (clone, push, pull) are NOT exercised here to keep
|
|
9
|
-
* tests fast and hermetic.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { describe, it, expect } from 'vitest';
|
|
13
|
-
import { fileURLToPath } from 'node:url';
|
|
14
|
-
import { join, dirname } from 'node:path';
|
|
15
|
-
import { FileSystemOperations } from '../tools/file-ops';
|
|
16
|
-
import { GitOperations } from '../tools/git-ops';
|
|
17
|
-
|
|
18
|
-
// The repository root is two levels above this test file: src/__tests__/ -> src/ -> repo-root
|
|
19
|
-
const REPO_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
20
|
-
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
// FileSystemOperations
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
|
|
25
|
-
describe('FileSystemOperations', () => {
|
|
26
|
-
it('can be instantiated with no arguments (defaults to cwd)', () => {
|
|
27
|
-
const ops = new FileSystemOperations();
|
|
28
|
-
expect(ops).toBeInstanceOf(FileSystemOperations);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('can be instantiated with a specific base path', () => {
|
|
32
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
33
|
-
expect(ops).toBeInstanceOf(FileSystemOperations);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('readFile reads the package.json at the repo root', async () => {
|
|
37
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
38
|
-
const content = await ops.readFile('package.json');
|
|
39
|
-
expect(typeof content).toBe('string');
|
|
40
|
-
expect(content.length).toBeGreaterThan(0);
|
|
41
|
-
// Verify it is valid JSON containing expected nimbus fields
|
|
42
|
-
const pkg = JSON.parse(content);
|
|
43
|
-
expect(pkg.name).toBe('@build-astron-co/nimbus');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('exists() returns true for a known file', async () => {
|
|
47
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
48
|
-
const result = await ops.exists('package.json');
|
|
49
|
-
expect(result).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('exists() returns false for a non-existent path', async () => {
|
|
53
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
54
|
-
const result = await ops.exists('this-file-does-not-exist-abc123.txt');
|
|
55
|
-
expect(result).toBe(false);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('stat() returns file statistics for package.json', async () => {
|
|
59
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
60
|
-
const stats = await ops.stat('package.json');
|
|
61
|
-
|
|
62
|
-
expect(stats.isFile).toBe(true);
|
|
63
|
-
expect(stats.isDirectory).toBe(false);
|
|
64
|
-
expect(stats.size).toBeGreaterThan(0);
|
|
65
|
-
expect(stats.modifiedAt).toBeInstanceOf(Date);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('readDir() lists the src directory', async () => {
|
|
69
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
70
|
-
const entries = await ops.readDir('src');
|
|
71
|
-
|
|
72
|
-
expect(Array.isArray(entries)).toBe(true);
|
|
73
|
-
expect(entries.length).toBeGreaterThan(0);
|
|
74
|
-
// src/ contains at least app.ts and version.ts
|
|
75
|
-
const names = entries.map(e => e.name);
|
|
76
|
-
expect(names).toContain('app.ts');
|
|
77
|
-
expect(names).toContain('version.ts');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('readFile throws when attempting to read a sensitive file', async () => {
|
|
81
|
-
const ops = new FileSystemOperations(REPO_ROOT);
|
|
82
|
-
// .env files are blocked by the sensitive-file guard
|
|
83
|
-
await expect(ops.readFile('.env')).rejects.toThrow();
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// ---------------------------------------------------------------------------
|
|
88
|
-
// GitOperations
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
|
|
91
|
-
describe('GitOperations', () => {
|
|
92
|
-
it('can be instantiated with no arguments (defaults to cwd)', () => {
|
|
93
|
-
const git = new GitOperations();
|
|
94
|
-
expect(git).toBeInstanceOf(GitOperations);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('can be instantiated with a specific repo path', () => {
|
|
98
|
-
const git = new GitOperations(REPO_ROOT);
|
|
99
|
-
expect(git).toBeInstanceOf(GitOperations);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('isRepo() returns true for the nimbus repository', async () => {
|
|
103
|
-
const git = new GitOperations(REPO_ROOT);
|
|
104
|
-
const result = await git.isRepo();
|
|
105
|
-
expect(result).toBe(true);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('currentBranch() returns a non-empty string', async () => {
|
|
109
|
-
const git = new GitOperations(REPO_ROOT);
|
|
110
|
-
const branch = await git.currentBranch();
|
|
111
|
-
expect(typeof branch).toBe('string');
|
|
112
|
-
expect(branch.length).toBeGreaterThan(0);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('status() returns a status result with expected shape', async () => {
|
|
116
|
-
const git = new GitOperations(REPO_ROOT);
|
|
117
|
-
const status = await git.status();
|
|
118
|
-
// StatusResult from simple-git has a `current` property and isClean()
|
|
119
|
-
expect(typeof status.isClean).toBe('function');
|
|
120
|
-
expect(typeof status.current).toBe('string');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('listBranches() returns current branch and branch list', async () => {
|
|
124
|
-
const git = new GitOperations(REPO_ROOT);
|
|
125
|
-
const { current, branches } = await git.listBranches();
|
|
126
|
-
expect(typeof current).toBe('string');
|
|
127
|
-
expect(Array.isArray(branches)).toBe(true);
|
|
128
|
-
expect(branches.length).toBeGreaterThan(0);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('listTags() returns an array', async () => {
|
|
132
|
-
const git = new GitOperations(REPO_ROOT);
|
|
133
|
-
const tags = await git.listTags();
|
|
134
|
-
expect(Array.isArray(tags)).toBe(true);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it('getShortHash() returns a short commit hash string', async () => {
|
|
138
|
-
const git = new GitOperations(REPO_ROOT);
|
|
139
|
-
const hash = await git.getShortHash('HEAD');
|
|
140
|
-
expect(typeof hash).toBe('string');
|
|
141
|
-
// Short hashes are typically 7–12 hex characters
|
|
142
|
-
expect(/^[0-9a-f]{4,12}$/.test(hash)).toBe(true);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version Command Tests — L3
|
|
3
|
-
*
|
|
4
|
-
* Validates that `nimbus version --json` returns valid JSON with
|
|
5
|
-
* required fields: version, node, platform, arch.
|
|
6
|
-
*
|
|
7
|
-
* Also validates that `nimbus update` is an alias for `upgrade` in cli.ts.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
11
|
-
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
// L3: version --json
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
|
|
16
|
-
describe('versionCommand --json (L3)', () => {
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
-
let consoleSpy: any;
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
-
let exitSpy: any;
|
|
21
|
-
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
24
|
-
exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => {}) as never);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
vi.restoreAllMocks();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
test('outputs valid JSON to stdout when json option is true', async () => {
|
|
32
|
-
const { versionCommand } = await import('../commands/version');
|
|
33
|
-
await versionCommand({ json: true });
|
|
34
|
-
|
|
35
|
-
// process.exit(0) should have been called
|
|
36
|
-
expect(exitSpy).toHaveBeenCalledWith(0);
|
|
37
|
-
|
|
38
|
-
// console.log should have been called with JSON
|
|
39
|
-
expect(consoleSpy).toHaveBeenCalled();
|
|
40
|
-
|
|
41
|
-
const jsonArg = consoleSpy.mock.calls[0][0] as string;
|
|
42
|
-
expect(() => JSON.parse(jsonArg)).not.toThrow();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('JSON output contains required fields: version, node, platform, arch', async () => {
|
|
46
|
-
const { versionCommand } = await import('../commands/version');
|
|
47
|
-
await versionCommand({ json: true });
|
|
48
|
-
|
|
49
|
-
const jsonArg = consoleSpy.mock.calls[0][0] as string;
|
|
50
|
-
const parsed = JSON.parse(jsonArg);
|
|
51
|
-
|
|
52
|
-
expect(parsed).toHaveProperty('version');
|
|
53
|
-
expect(parsed).toHaveProperty('node');
|
|
54
|
-
expect(parsed).toHaveProperty('platform');
|
|
55
|
-
expect(parsed).toHaveProperty('arch');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('JSON version field is a non-empty string', async () => {
|
|
59
|
-
const { versionCommand } = await import('../commands/version');
|
|
60
|
-
await versionCommand({ json: true });
|
|
61
|
-
|
|
62
|
-
const jsonArg = consoleSpy.mock.calls[0][0] as string;
|
|
63
|
-
const parsed = JSON.parse(jsonArg);
|
|
64
|
-
|
|
65
|
-
expect(typeof parsed.version).toBe('string');
|
|
66
|
-
expect(parsed.version.length).toBeGreaterThan(0);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('JSON node field matches process.version', async () => {
|
|
70
|
-
const { versionCommand } = await import('../commands/version');
|
|
71
|
-
await versionCommand({ json: true });
|
|
72
|
-
|
|
73
|
-
const jsonArg = consoleSpy.mock.calls[0][0] as string;
|
|
74
|
-
const parsed = JSON.parse(jsonArg);
|
|
75
|
-
|
|
76
|
-
expect(parsed.node).toBe(process.version);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('JSON platform field matches process.platform', async () => {
|
|
80
|
-
const { versionCommand } = await import('../commands/version');
|
|
81
|
-
await versionCommand({ json: true });
|
|
82
|
-
|
|
83
|
-
const jsonArg = consoleSpy.mock.calls[0][0] as string;
|
|
84
|
-
const parsed = JSON.parse(jsonArg);
|
|
85
|
-
|
|
86
|
-
expect(parsed.platform).toBe(process.platform);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test('JSON arch field matches process.arch', async () => {
|
|
90
|
-
const { versionCommand } = await import('../commands/version');
|
|
91
|
-
await versionCommand({ json: true });
|
|
92
|
-
|
|
93
|
-
const jsonArg = consoleSpy.mock.calls[0][0] as string;
|
|
94
|
-
const parsed = JSON.parse(jsonArg);
|
|
95
|
-
|
|
96
|
-
expect(parsed.arch).toBe(process.arch);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('without --json flag, does not call process.exit(0)', async () => {
|
|
100
|
-
const { versionCommand } = await import('../commands/version');
|
|
101
|
-
await versionCommand({ json: false });
|
|
102
|
-
|
|
103
|
-
expect(exitSpy).not.toHaveBeenCalledWith(0);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
// L1: `nimbus update` alias for `upgrade`
|
|
109
|
-
// ---------------------------------------------------------------------------
|
|
110
|
-
|
|
111
|
-
describe('nimbus update alias (L1)', () => {
|
|
112
|
-
test('runCommand treats "update" the same as "upgrade"', async () => {
|
|
113
|
-
// Verify that both 'upgrade' and 'update' route to the upgrade handler
|
|
114
|
-
// by checking the COMMAND_ALIASES or the if-condition in cli.ts.
|
|
115
|
-
// We test this by importing runCommand and stubbing upgradeCommand.
|
|
116
|
-
|
|
117
|
-
const upgradeMod = await import('../commands/upgrade');
|
|
118
|
-
const upgradeSpy = vi.spyOn(upgradeMod, 'upgradeCommand').mockResolvedValue(undefined);
|
|
119
|
-
|
|
120
|
-
const { runCommand } = await import('../cli');
|
|
121
|
-
await runCommand(['update', '--check']);
|
|
122
|
-
|
|
123
|
-
expect(upgradeSpy).toHaveBeenCalledWith(expect.objectContaining({ check: true }));
|
|
124
|
-
|
|
125
|
-
upgradeSpy.mockRestore();
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test('runCommand treats "upgrade" the same as "update"', async () => {
|
|
129
|
-
const upgradeMod = await import('../commands/upgrade');
|
|
130
|
-
const upgradeSpy = vi.spyOn(upgradeMod, 'upgradeCommand').mockResolvedValue(undefined);
|
|
131
|
-
|
|
132
|
-
const { runCommand } = await import('../cli');
|
|
133
|
-
await runCommand(['upgrade', '--check']);
|
|
134
|
-
|
|
135
|
-
expect(upgradeSpy).toHaveBeenCalledWith(expect.objectContaining({ check: true }));
|
|
136
|
-
|
|
137
|
-
upgradeSpy.mockRestore();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// ---------------------------------------------------------------------------
|
|
142
|
-
// L2: --quiet flag for doctor
|
|
143
|
-
// ---------------------------------------------------------------------------
|
|
144
|
-
|
|
145
|
-
describe('doctorCommand --quiet (L2)', () => {
|
|
146
|
-
test('DoctorOptions interface accepts quiet field', async () => {
|
|
147
|
-
const { doctorCommand } = await import('../commands/doctor');
|
|
148
|
-
// Just verifying the function can be called with quiet option without type errors
|
|
149
|
-
expect(typeof doctorCommand).toBe('function');
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
// L2: --quiet flag for logs
|
|
155
|
-
// ---------------------------------------------------------------------------
|
|
156
|
-
|
|
157
|
-
describe('parseLogsArgs --quiet (L2)', () => {
|
|
158
|
-
test('parses -q as quiet option', async () => {
|
|
159
|
-
const { parseLogsArgs } = await import('../commands/logs');
|
|
160
|
-
const { options } = parseLogsArgs(['my-pod', '-q']);
|
|
161
|
-
expect(options.quiet).toBe(true);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test('parses --quiet as quiet option', async () => {
|
|
165
|
-
const { parseLogsArgs } = await import('../commands/logs');
|
|
166
|
-
const { options } = parseLogsArgs(['my-pod', '--quiet']);
|
|
167
|
-
expect(options.quiet).toBe(true);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test('quiet is false when not provided', async () => {
|
|
171
|
-
const { parseLogsArgs } = await import('../commands/logs');
|
|
172
|
-
const { options } = parseLogsArgs(['my-pod']);
|
|
173
|
-
expect(options.quiet).toBeUndefined();
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
test('parses --quiet along with other flags', async () => {
|
|
177
|
-
const { parseLogsArgs } = await import('../commands/logs');
|
|
178
|
-
const { pod, options } = parseLogsArgs(['my-pod', '-n', 'default', '--quiet', '-f']);
|
|
179
|
-
expect(pod).toBe('my-pod');
|
|
180
|
-
expect(options.namespace).toBe('default');
|
|
181
|
-
expect(options.quiet).toBe(true);
|
|
182
|
-
expect(options.follow).toBe(true);
|
|
183
|
-
});
|
|
184
|
-
});
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for src/version.ts
|
|
3
|
-
*
|
|
4
|
-
* Verifies that the module exports a valid semver VERSION string and a
|
|
5
|
-
* non-empty BUILD_DATE string.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, it, expect } from 'vitest';
|
|
9
|
-
import { VERSION, BUILD_DATE } from '../version';
|
|
10
|
-
|
|
11
|
-
describe('version', () => {
|
|
12
|
-
it('exports VERSION as a non-empty string', () => {
|
|
13
|
-
expect(typeof VERSION).toBe('string');
|
|
14
|
-
expect(VERSION.length).toBeGreaterThan(0);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('VERSION matches semver format (MAJOR.MINOR.PATCH)', () => {
|
|
18
|
-
// A loose semver pattern: digits separated by dots, with optional pre-release
|
|
19
|
-
const semverLoose = /^\d+\.\d+\.\d+/;
|
|
20
|
-
expect(semverLoose.test(VERSION)).toBe(true);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('VERSION major version is a non-negative integer', () => {
|
|
24
|
-
const major = parseInt(VERSION.split('.')[0], 10);
|
|
25
|
-
expect(Number.isInteger(major)).toBe(true);
|
|
26
|
-
expect(major).toBeGreaterThanOrEqual(0);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('VERSION minor and patch are non-negative integers', () => {
|
|
30
|
-
const parts = VERSION.split('.');
|
|
31
|
-
const minor = parseInt(parts[1], 10);
|
|
32
|
-
const patch = parseInt(parts[2], 10);
|
|
33
|
-
expect(minor).toBeGreaterThanOrEqual(0);
|
|
34
|
-
expect(patch).toBeGreaterThanOrEqual(0);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('exports BUILD_DATE as a non-empty string', () => {
|
|
38
|
-
expect(typeof BUILD_DATE).toBe('string');
|
|
39
|
-
expect(BUILD_DATE.length).toBeGreaterThan(0);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('BUILD_DATE is "dev" in development or ISO-like date in builds', () => {
|
|
43
|
-
// In dev mode the placeholder is detected and replaced with 'dev'.
|
|
44
|
-
// After a compiled build it is an ISO 8601 date string (YYYY-MM-DD).
|
|
45
|
-
const isDev = BUILD_DATE === 'dev';
|
|
46
|
-
const isISODate = /^\d{4}-\d{2}-\d{2}/.test(BUILD_DATE);
|
|
47
|
-
expect(isDev || isISODate).toBe(true);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Watch Command Tests (M3)
|
|
3
|
-
*
|
|
4
|
-
* Tests the nimbus watch command which watches files and triggers agent runs.
|
|
5
|
-
* Validates glob matching, option parsing, and command export.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, it, expect } from 'vitest';
|
|
9
|
-
import { readFileSync } from 'node:fs';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
// Import and verify exports
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
|
|
16
|
-
describe('watchCommand exports', () => {
|
|
17
|
-
it('watchCommand is exported from commands/watch.ts', async () => {
|
|
18
|
-
const { watchCommand } = await import('../commands/watch');
|
|
19
|
-
expect(typeof watchCommand).toBe('function');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('WatchOptions interface supports required fields', () => {
|
|
23
|
-
// Type-level check via source inspection
|
|
24
|
-
const src = readFileSync(join(process.cwd(), 'src/commands/watch.ts'), 'utf-8');
|
|
25
|
-
expect(src).toContain('glob: string');
|
|
26
|
-
expect(src).toContain('run?:');
|
|
27
|
-
expect(src).toContain('debounce?:');
|
|
28
|
-
expect(src).toContain('autoApprove?:');
|
|
29
|
-
expect(src).toContain('maxRuns?:');
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Glob matching logic (inline reproduction)
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
|
|
37
|
-
function matchGlob(filename: string, pattern: string): boolean {
|
|
38
|
-
const f = filename.replace(/\\/g, '/');
|
|
39
|
-
const p = pattern.replace(/\\/g, '/');
|
|
40
|
-
|
|
41
|
-
const regexStr = p
|
|
42
|
-
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
43
|
-
.replace(/\*\*/g, '__GLOBSTAR__')
|
|
44
|
-
.replace(/\*/g, '[^/]*')
|
|
45
|
-
.replace(/\?/g, '[^/]')
|
|
46
|
-
.replace(/__GLOBSTAR__/g, '.*');
|
|
47
|
-
|
|
48
|
-
const re = new RegExp(`^${regexStr}$`);
|
|
49
|
-
const { basename } = require('node:path');
|
|
50
|
-
const base = basename(f);
|
|
51
|
-
return re.test(f) || (!/\//.test(p) && re.test(base));
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
describe('matchGlob (M3 — watch command glob matching)', () => {
|
|
55
|
-
it('matches *.tf against main.tf', () => {
|
|
56
|
-
expect(matchGlob('main.tf', '*.tf')).toBe(true);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('matches *.tf against variables.tf', () => {
|
|
60
|
-
expect(matchGlob('variables.tf', '*.tf')).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('does not match *.tf against main.ts', () => {
|
|
64
|
-
expect(matchGlob('main.ts', '*.tf')).toBe(false);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('matches *.yaml against deploy.yaml', () => {
|
|
68
|
-
expect(matchGlob('deploy.yaml', '*.yaml')).toBe(true);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('matches *.yaml against deploy.yml', () => {
|
|
72
|
-
expect(matchGlob('deploy.yml', '*.yaml')).toBe(false);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('matches *.yml against deploy.yml', () => {
|
|
76
|
-
expect(matchGlob('deploy.yml', '*.yml')).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('matches src/** against src/index.ts', () => {
|
|
80
|
-
expect(matchGlob('src/index.ts', 'src/**')).toBe(true);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('matches src/** against src/utils/helper.ts', () => {
|
|
84
|
-
expect(matchGlob('src/utils/helper.ts', 'src/**')).toBe(true);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('does not match src/** against lib/index.ts', () => {
|
|
88
|
-
expect(matchGlob('lib/index.ts', 'src/**')).toBe(false);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('matches Dockerfile exactly', () => {
|
|
92
|
-
expect(matchGlob('Dockerfile', 'Dockerfile')).toBe(true);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('matches nested *.tf in subdir', () => {
|
|
96
|
-
expect(matchGlob('modules/vpc/main.tf', '*.tf')).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// ---------------------------------------------------------------------------
|
|
101
|
-
// CLI wiring — watch is registered in cli.ts
|
|
102
|
-
// ---------------------------------------------------------------------------
|
|
103
|
-
|
|
104
|
-
describe('watch command wired in CLI (M3)', () => {
|
|
105
|
-
it('cli.ts contains nimbus watch handler', () => {
|
|
106
|
-
const src = readFileSync(join(process.cwd(), 'src/cli.ts'), 'utf-8');
|
|
107
|
-
expect(src).toContain("command === 'watch'");
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('cli.ts imports watchCommand from commands/watch', () => {
|
|
111
|
-
const src = readFileSync(join(process.cwd(), 'src/cli.ts'), 'utf-8');
|
|
112
|
-
expect(src).toContain("import('./commands/watch')");
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('cli.ts parses --run flag for watch', () => {
|
|
116
|
-
const src = readFileSync(join(process.cwd(), 'src/cli.ts'), 'utf-8');
|
|
117
|
-
expect(src).toContain("watchOptions.run = args[++i]");
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('cli.ts parses --debounce flag for watch', () => {
|
|
121
|
-
const src = readFileSync(join(process.cwd(), 'src/cli.ts'), 'utf-8');
|
|
122
|
-
expect(src).toContain("watchOptions.debounce");
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('cli.ts parses --auto-approve flag for watch', () => {
|
|
126
|
-
const src = readFileSync(join(process.cwd(), 'src/cli.ts'), 'utf-8');
|
|
127
|
-
expect(src).toContain("watchOptions.autoApprove = true");
|
|
128
|
-
});
|
|
129
|
-
});
|