@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
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Team NIMBUS.md Distribution (L6)
|
|
3
|
-
*
|
|
4
|
-
* Share project context files with team members.
|
|
5
|
-
*
|
|
6
|
-
* nimbus team-context push — share current NIMBUS.md via sharing service
|
|
7
|
-
* nimbus team-context pull <url> — download NIMBUS.md, show diff, prompt before overwrite
|
|
8
|
-
*
|
|
9
|
-
* Also supports NIMBUS_INSTRUCTIONS_URL env var: on startup, fetch that URL
|
|
10
|
-
* and use as NIMBUS.md if local file not present.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import * as fs from 'node:fs';
|
|
14
|
-
import * as path from 'node:path';
|
|
15
|
-
import { ui } from '../wizard/ui';
|
|
16
|
-
|
|
17
|
-
const NIMBUS_MD_PATHS = [
|
|
18
|
-
path.join(process.cwd(), 'NIMBUS.md'),
|
|
19
|
-
path.join(process.cwd(), '.nimbus', 'NIMBUS.md'),
|
|
20
|
-
];
|
|
21
|
-
|
|
22
|
-
function findLocalNimbusMd(): string | null {
|
|
23
|
-
for (const p of NIMBUS_MD_PATHS) {
|
|
24
|
-
if (fs.existsSync(p)) return p;
|
|
25
|
-
}
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function computeDiff(oldContent: string, newContent: string): string {
|
|
30
|
-
const oldLines = oldContent.split('\n');
|
|
31
|
-
const newLines = newContent.split('\n');
|
|
32
|
-
const lines: string[] = [];
|
|
33
|
-
|
|
34
|
-
const maxLen = Math.max(oldLines.length, newLines.length);
|
|
35
|
-
for (let i = 0; i < maxLen; i++) {
|
|
36
|
-
const old = oldLines[i];
|
|
37
|
-
const newLine = newLines[i];
|
|
38
|
-
if (old === undefined) {
|
|
39
|
-
lines.push(`+ ${newLine}`);
|
|
40
|
-
} else if (newLine === undefined) {
|
|
41
|
-
lines.push(`- ${old}`);
|
|
42
|
-
} else if (old !== newLine) {
|
|
43
|
-
lines.push(`- ${old}`);
|
|
44
|
-
lines.push(`+ ${newLine}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return lines.join('\n');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Path to the team.md file in the current project's .nimbus/ directory */
|
|
51
|
-
const TEAM_MD_PATH = path.join(process.cwd(), '.nimbus', 'team.md');
|
|
52
|
-
|
|
53
|
-
/** Regex to strip lines containing sensitive info */
|
|
54
|
-
const SENSITIVE_PATTERN = /SENSITIVE:/i;
|
|
55
|
-
|
|
56
|
-
/** Strip lines containing "SENSITIVE:" from NIMBUS.md before sharing */
|
|
57
|
-
function stripSensitiveLines(content: string): string {
|
|
58
|
-
return content
|
|
59
|
-
.split('\n')
|
|
60
|
-
.filter(line => !SENSITIVE_PATTERN.test(line))
|
|
61
|
-
.join('\n');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Merge non-duplicate sections from teamContent into localContent.
|
|
66
|
-
* Sections are identified by Markdown headings (## ...).
|
|
67
|
-
*/
|
|
68
|
-
function mergeSections(localContent: string, teamContent: string): string {
|
|
69
|
-
// Split into sections by heading
|
|
70
|
-
const sectionRegex = /(?=^#{1,3} .+$)/m;
|
|
71
|
-
const localSections = localContent.split(sectionRegex);
|
|
72
|
-
const teamSections = teamContent.split(sectionRegex);
|
|
73
|
-
|
|
74
|
-
const localHeadings = new Set(
|
|
75
|
-
localSections
|
|
76
|
-
.map(s => s.match(/^(#{1,3} .+)$/m)?.[1]?.trim())
|
|
77
|
-
.filter(Boolean)
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
const newSections = teamSections.filter(s => {
|
|
81
|
-
const heading = s.match(/^(#{1,3} .+)$/m)?.[1]?.trim();
|
|
82
|
-
return heading && !localHeadings.has(heading);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
if (newSections.length === 0) return localContent;
|
|
86
|
-
|
|
87
|
-
const merged = localContent.trimEnd() + '\n\n' + newSections.join('\n').trimStart();
|
|
88
|
-
return merged;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export async function teamContextCommand(subcommand: string, args: string[]): Promise<void> {
|
|
92
|
-
switch (subcommand) {
|
|
93
|
-
case 'push': {
|
|
94
|
-
// Git-based push: read NIMBUS.md, strip SENSITIVE lines, write to .nimbus/team.md
|
|
95
|
-
const localPath = findLocalNimbusMd();
|
|
96
|
-
if (!localPath) {
|
|
97
|
-
ui.warning('No NIMBUS.md found in current directory. Run `nimbus init` first.');
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const content = fs.readFileSync(localPath, 'utf-8');
|
|
102
|
-
const sanitized = stripSensitiveLines(content);
|
|
103
|
-
|
|
104
|
-
// Ensure .nimbus/ directory exists
|
|
105
|
-
const nimbusDir = path.dirname(TEAM_MD_PATH);
|
|
106
|
-
if (!fs.existsSync(nimbusDir)) {
|
|
107
|
-
fs.mkdirSync(nimbusDir, { recursive: true });
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
fs.writeFileSync(TEAM_MD_PATH, sanitized, 'utf-8');
|
|
111
|
-
ui.print(`${ui.color('✓', 'green')} Written sanitized context to ${TEAM_MD_PATH}`);
|
|
112
|
-
ui.dim(`Removed all lines containing "SENSITIVE:"`);
|
|
113
|
-
ui.newLine();
|
|
114
|
-
|
|
115
|
-
// Stage the file with git
|
|
116
|
-
try {
|
|
117
|
-
const { execFileSync } = await import('node:child_process');
|
|
118
|
-
execFileSync('git', ['add', TEAM_MD_PATH], {
|
|
119
|
-
encoding: 'utf-8',
|
|
120
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
121
|
-
timeout: 10_000,
|
|
122
|
-
});
|
|
123
|
-
ui.print(`${ui.color('✓', 'green')} Staged .nimbus/team.md with git`);
|
|
124
|
-
ui.print(' Next step: git commit -m "chore: update team context" && git push');
|
|
125
|
-
} catch {
|
|
126
|
-
ui.dim('(git stage skipped — not a git repo or git not in PATH)');
|
|
127
|
-
ui.print(' Copy .nimbus/team.md to your repository and commit/push it manually.');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
ui.newLine();
|
|
131
|
-
ui.info('Note: Add .nimbus/team.md to version control (do NOT add .nimbus/team.md to .gitignore).');
|
|
132
|
-
ui.dim('Add NIMBUS.md to .gitignore if it contains sensitive local config.');
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
case 'pull': {
|
|
137
|
-
// Git-based pull: read .nimbus/team.md from cwd, diff, merge
|
|
138
|
-
if (!fs.existsSync(TEAM_MD_PATH)) {
|
|
139
|
-
ui.error(`.nimbus/team.md not found in ${process.cwd()}`);
|
|
140
|
-
ui.dim('Run `git pull` to fetch the latest team context, then re-run this command.');
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const teamContent = fs.readFileSync(TEAM_MD_PATH, 'utf-8');
|
|
145
|
-
const targetPath = NIMBUS_MD_PATHS[0];
|
|
146
|
-
const existing = fs.existsSync(targetPath) ? fs.readFileSync(targetPath, 'utf-8') : null;
|
|
147
|
-
|
|
148
|
-
if (existing) {
|
|
149
|
-
const diff = computeDiff(existing, teamContent);
|
|
150
|
-
if (!diff) {
|
|
151
|
-
ui.info('NIMBUS.md is already up to date with team.md.');
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
ui.header('NIMBUS.md vs .nimbus/team.md diff');
|
|
156
|
-
for (const line of diff.split('\n')) {
|
|
157
|
-
if (line.startsWith('+')) {
|
|
158
|
-
ui.print(ui.color(line, 'green'));
|
|
159
|
-
} else if (line.startsWith('-')) {
|
|
160
|
-
ui.print(ui.color(line, 'red'));
|
|
161
|
-
} else {
|
|
162
|
-
ui.print(line);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
ui.newLine();
|
|
166
|
-
|
|
167
|
-
// Prompt for confirmation
|
|
168
|
-
const { input: inputPrompt } = await import('../wizard/prompts');
|
|
169
|
-
const answer = await inputPrompt({
|
|
170
|
-
message: 'Merge new sections from team.md into NIMBUS.md? [y/N]',
|
|
171
|
-
defaultValue: 'N',
|
|
172
|
-
});
|
|
173
|
-
if (answer.toLowerCase() !== 'y') {
|
|
174
|
-
ui.info('Aborted — NIMBUS.md not changed.');
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Merge: append non-duplicate sections
|
|
179
|
-
const merged = mergeSections(existing, teamContent);
|
|
180
|
-
fs.writeFileSync(targetPath, merged, 'utf-8');
|
|
181
|
-
ui.print(`${ui.color('✓', 'green')} Merged team context into ${targetPath}`);
|
|
182
|
-
} else {
|
|
183
|
-
// No local NIMBUS.md — use team.md as starting point
|
|
184
|
-
fs.writeFileSync(targetPath, teamContent, 'utf-8');
|
|
185
|
-
ui.print(`${ui.color('✓', 'green')} Created ${targetPath} from .nimbus/team.md`);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
ui.newLine();
|
|
189
|
-
ui.dim('Note: Add NIMBUS.md to .gitignore to keep local config private.');
|
|
190
|
-
ui.dim('Add .nimbus/team.md to version control to share project context with team.');
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
default:
|
|
195
|
-
ui.print('Usage: nimbus team-context <push|pull>');
|
|
196
|
-
ui.print('');
|
|
197
|
-
ui.print(' push Strip SENSITIVE: lines from NIMBUS.md, write to .nimbus/team.md, and git add');
|
|
198
|
-
ui.print(' pull Read .nimbus/team.md, diff against NIMBUS.md, merge on confirmation');
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Fetch NIMBUS.md from NIMBUS_INSTRUCTIONS_URL env var.
|
|
204
|
-
* Called on startup when no local NIMBUS.md exists.
|
|
205
|
-
*/
|
|
206
|
-
export async function fetchRemoteNimbusMd(): Promise<string | null> {
|
|
207
|
-
const url = process.env.NIMBUS_INSTRUCTIONS_URL;
|
|
208
|
-
if (!url) return null;
|
|
209
|
-
|
|
210
|
-
const localPath = findLocalNimbusMd();
|
|
211
|
-
if (localPath) return null; // local file takes priority
|
|
212
|
-
|
|
213
|
-
try {
|
|
214
|
-
const response = await fetch(url, { signal: AbortSignal.timeout(10_000) });
|
|
215
|
-
if (!response.ok) return null;
|
|
216
|
-
return await response.text();
|
|
217
|
-
} catch {
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
}
|
package/src/commands/template.ts
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Template Commands
|
|
3
|
-
*
|
|
4
|
-
* CLI commands for managing infrastructure templates
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { getDb } from '../state/db';
|
|
8
|
-
import { randomUUID } from 'crypto';
|
|
9
|
-
import { ui } from '../wizard/ui';
|
|
10
|
-
|
|
11
|
-
export interface TemplateCommandOptions {
|
|
12
|
-
type?: string;
|
|
13
|
-
name?: string;
|
|
14
|
-
file?: string;
|
|
15
|
-
json?: boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* List all templates
|
|
20
|
-
*/
|
|
21
|
-
async function templateListCommand(options: TemplateCommandOptions = {}): Promise<void> {
|
|
22
|
-
ui.header('Templates');
|
|
23
|
-
ui.startSpinner({ message: 'Fetching templates...' });
|
|
24
|
-
|
|
25
|
-
try {
|
|
26
|
-
const db = getDb();
|
|
27
|
-
const templates = db
|
|
28
|
-
.prepare(
|
|
29
|
-
'SELECT * FROM templates WHERE (? IS NULL OR type=?) ORDER BY created_at DESC'
|
|
30
|
-
)
|
|
31
|
-
.all(options.type ?? null, options.type ?? null) as Array<Record<string, unknown>>;
|
|
32
|
-
|
|
33
|
-
ui.stopSpinnerSuccess(`Found ${templates.length} template(s)`);
|
|
34
|
-
|
|
35
|
-
if (templates.length > 0) {
|
|
36
|
-
ui.table({
|
|
37
|
-
columns: [
|
|
38
|
-
{ key: 'id', header: 'ID' },
|
|
39
|
-
{ key: 'name', header: 'Name' },
|
|
40
|
-
{ key: 'type', header: 'Type' },
|
|
41
|
-
{ key: 'createdAt', header: 'Created' },
|
|
42
|
-
],
|
|
43
|
-
data: templates.map((t) => ({
|
|
44
|
-
id: typeof t.id === 'string' ? t.id.substring(0, 8) : '-',
|
|
45
|
-
name: typeof t.name === 'string' ? t.name : '-',
|
|
46
|
-
type: typeof t.type === 'string' ? t.type : '-',
|
|
47
|
-
createdAt:
|
|
48
|
-
typeof t.created_at === 'string'
|
|
49
|
-
? new Date(t.created_at).toLocaleDateString()
|
|
50
|
-
: '-',
|
|
51
|
-
})),
|
|
52
|
-
});
|
|
53
|
-
} else {
|
|
54
|
-
ui.info('No templates found. Use "nimbus template save" to create one.');
|
|
55
|
-
}
|
|
56
|
-
} catch (error: any) {
|
|
57
|
-
ui.stopSpinnerFail('Error fetching templates');
|
|
58
|
-
ui.error(error.message);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Get a specific template by ID
|
|
64
|
-
*/
|
|
65
|
-
async function templateGetCommand(
|
|
66
|
-
id: string,
|
|
67
|
-
_options: TemplateCommandOptions = {}
|
|
68
|
-
): Promise<void> {
|
|
69
|
-
ui.header(`Template: ${id}`);
|
|
70
|
-
ui.startSpinner({ message: 'Fetching template...' });
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
const db = getDb();
|
|
74
|
-
const template = db
|
|
75
|
-
.prepare('SELECT * FROM templates WHERE id LIKE ?')
|
|
76
|
-
.get(id + '%') as Record<string, unknown> | undefined;
|
|
77
|
-
|
|
78
|
-
if (template) {
|
|
79
|
-
ui.stopSpinnerSuccess('Template retrieved');
|
|
80
|
-
|
|
81
|
-
ui.print(` ${ui.color('Name:', 'cyan')} ${template.name || '-'}`);
|
|
82
|
-
ui.print(` ${ui.color('Type:', 'cyan')} ${template.type || '-'}`);
|
|
83
|
-
ui.print(` ${ui.color('ID:', 'cyan')} ${template.id || '-'}`);
|
|
84
|
-
ui.print(` ${ui.color('Created:', 'cyan')} ${template.created_at || '-'}`);
|
|
85
|
-
|
|
86
|
-
let variables: Record<string, unknown> = {};
|
|
87
|
-
try {
|
|
88
|
-
variables =
|
|
89
|
-
typeof template.variables === 'string'
|
|
90
|
-
? JSON.parse(template.variables)
|
|
91
|
-
: {};
|
|
92
|
-
} catch { /* ignore */ }
|
|
93
|
-
|
|
94
|
-
if (Object.keys(variables).length > 0) {
|
|
95
|
-
ui.newLine();
|
|
96
|
-
ui.print(` ${ui.color('Variables:', 'cyan')}`);
|
|
97
|
-
for (const [key, val] of Object.entries(variables)) {
|
|
98
|
-
ui.print(` ${key}: ${JSON.stringify(val)}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (template.content) {
|
|
103
|
-
ui.newLine();
|
|
104
|
-
ui.box({
|
|
105
|
-
title: 'Content',
|
|
106
|
-
content:
|
|
107
|
-
typeof template.content === 'string'
|
|
108
|
-
? template.content
|
|
109
|
-
: JSON.stringify(template.content, null, 2),
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
} else {
|
|
113
|
-
ui.stopSpinnerFail('Template not found');
|
|
114
|
-
}
|
|
115
|
-
} catch (error: any) {
|
|
116
|
-
ui.stopSpinnerFail('Error fetching template');
|
|
117
|
-
ui.error(error.message);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Save a new template
|
|
123
|
-
*/
|
|
124
|
-
async function templateSaveCommand(options: TemplateCommandOptions = {}): Promise<void> {
|
|
125
|
-
ui.header('Save Template');
|
|
126
|
-
|
|
127
|
-
if (!options.name) {
|
|
128
|
-
ui.error('Template name is required. Use --name <name>');
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
let content = '';
|
|
133
|
-
if (options.file) {
|
|
134
|
-
try {
|
|
135
|
-
const fs = await import('fs');
|
|
136
|
-
content = fs.readFileSync(options.file, 'utf-8');
|
|
137
|
-
} catch (err: any) {
|
|
138
|
-
ui.error(`Failed to read file: ${err.message}`);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
ui.startSpinner({ message: 'Saving template...' });
|
|
144
|
-
|
|
145
|
-
try {
|
|
146
|
-
const db = getDb();
|
|
147
|
-
const id = randomUUID();
|
|
148
|
-
db.prepare(
|
|
149
|
-
'INSERT INTO templates (id,name,type,content,variables,created_at,updated_at) VALUES (?,?,?,?,?,datetime("now"),datetime("now"))'
|
|
150
|
-
).run(id, options.name, options.type || 'terraform', content, '{}');
|
|
151
|
-
|
|
152
|
-
ui.stopSpinnerSuccess(`Template "${options.name}" saved`);
|
|
153
|
-
ui.info(`ID: ${id}`);
|
|
154
|
-
} catch (error: any) {
|
|
155
|
-
ui.stopSpinnerFail('Error saving template');
|
|
156
|
-
ui.error(error.message);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Delete a template by ID
|
|
162
|
-
*/
|
|
163
|
-
async function templateDeleteCommand(id: string): Promise<void> {
|
|
164
|
-
ui.header(`Delete Template: ${id}`);
|
|
165
|
-
ui.startSpinner({ message: 'Deleting template...' });
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
const db = getDb();
|
|
169
|
-
const result = db.prepare('DELETE FROM templates WHERE id=?').run(id);
|
|
170
|
-
|
|
171
|
-
if ((result as any).changes > 0) {
|
|
172
|
-
ui.stopSpinnerSuccess('Template deleted');
|
|
173
|
-
} else {
|
|
174
|
-
ui.stopSpinnerFail('Template not found');
|
|
175
|
-
}
|
|
176
|
-
} catch (error: any) {
|
|
177
|
-
ui.stopSpinnerFail('Error deleting template');
|
|
178
|
-
ui.error(error.message);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Main template command router
|
|
184
|
-
*/
|
|
185
|
-
export async function templateCommand(subcommand: string, args: string[]): Promise<void> {
|
|
186
|
-
const options: TemplateCommandOptions = {};
|
|
187
|
-
const positionalArgs: string[] = [];
|
|
188
|
-
|
|
189
|
-
for (let i = 0; i < args.length; i++) {
|
|
190
|
-
const arg = args[i];
|
|
191
|
-
if (arg === '--type' || arg === '-t') {
|
|
192
|
-
options.type = args[++i];
|
|
193
|
-
} else if (arg === '--name' || arg === '-n') {
|
|
194
|
-
options.name = args[++i];
|
|
195
|
-
} else if (arg === '--file' || arg === '-f') {
|
|
196
|
-
options.file = args[++i];
|
|
197
|
-
} else if (arg === '--json') {
|
|
198
|
-
options.json = true;
|
|
199
|
-
} else if (!arg.startsWith('-')) {
|
|
200
|
-
positionalArgs.push(arg);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
switch (subcommand) {
|
|
205
|
-
case 'list':
|
|
206
|
-
case 'ls':
|
|
207
|
-
await templateListCommand(options);
|
|
208
|
-
break;
|
|
209
|
-
case 'get':
|
|
210
|
-
if (positionalArgs.length < 1) {
|
|
211
|
-
ui.error('Usage: nimbus template get <id>');
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
await templateGetCommand(positionalArgs[0], options);
|
|
215
|
-
break;
|
|
216
|
-
case 'save':
|
|
217
|
-
await templateSaveCommand(options);
|
|
218
|
-
break;
|
|
219
|
-
case 'delete':
|
|
220
|
-
case 'rm':
|
|
221
|
-
if (positionalArgs.length < 1) {
|
|
222
|
-
ui.error('Usage: nimbus template delete <id>');
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
await templateDeleteCommand(positionalArgs[0]);
|
|
226
|
-
break;
|
|
227
|
-
default:
|
|
228
|
-
ui.error(`Unknown template subcommand: ${subcommand || '(none)'}`);
|
|
229
|
-
ui.info(
|
|
230
|
-
'Available commands: list, get <id>, save --name <name> [--file <path>], delete <id>'
|
|
231
|
-
);
|
|
232
|
-
}
|
|
233
|
-
}
|