@build-astron-co/nimbus 0.2.0 → 0.4.0
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/bin/nimbus +26 -10
- package/bin/nimbus.cmd +41 -0
- package/bin/nimbus.mjs +70 -0
- package/completions/nimbus.bash +38 -0
- package/completions/nimbus.fish +48 -0
- package/completions/nimbus.zsh +81 -0
- package/dist/src/agent/compaction-agent.js +215 -0
- package/dist/src/agent/context-manager.js +385 -0
- package/dist/src/agent/context.js +322 -0
- package/dist/src/agent/deploy-preview.js +395 -0
- package/dist/src/agent/expand-files.js +95 -0
- package/dist/src/agent/index.js +18 -0
- package/dist/src/agent/loop.js +1535 -0
- package/dist/src/agent/modes.js +347 -0
- package/dist/src/agent/permissions.js +396 -0
- package/dist/src/agent/subagents/base.js +67 -0
- package/dist/src/agent/subagents/cost.js +45 -0
- package/dist/src/agent/subagents/explore.js +36 -0
- package/dist/src/agent/subagents/general.js +41 -0
- package/dist/src/agent/subagents/index.js +88 -0
- package/dist/src/agent/subagents/infra.js +52 -0
- package/dist/src/agent/subagents/security.js +60 -0
- package/dist/src/agent/system-prompt.js +860 -0
- package/dist/src/app.js +152 -0
- package/dist/src/audit/activity-log.js +209 -0
- package/dist/src/audit/compliance-checker.js +419 -0
- package/dist/src/audit/cost-tracker.js +231 -0
- package/dist/src/audit/index.js +10 -0
- package/dist/src/audit/security-scanner.js +490 -0
- package/dist/src/auth/guard.js +64 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/keychain.js +79 -0
- package/dist/src/auth/oauth.js +389 -0
- package/dist/src/auth/providers.js +415 -0
- package/dist/src/auth/sso.js +87 -0
- package/dist/src/auth/store.js +424 -0
- package/dist/src/auth/types.js +5 -0
- package/dist/src/cli/index.js +8 -0
- package/dist/src/cli/init.js +1048 -0
- package/dist/src/cli/openapi-spec.js +346 -0
- package/dist/src/cli/run.js +505 -0
- package/dist/src/cli/serve-auth.js +56 -0
- package/dist/src/cli/serve.js +432 -0
- package/dist/src/cli/web.js +50 -0
- package/dist/src/cli.js +1574 -0
- package/dist/src/clients/core-engine-client.js +156 -0
- package/dist/src/clients/enterprise-client.js +246 -0
- package/dist/src/clients/generator-client.js +219 -0
- package/dist/src/clients/git-client.js +367 -0
- package/dist/src/clients/github-client.js +229 -0
- package/dist/src/clients/helm-client.js +299 -0
- package/dist/src/clients/index.js +18 -0
- package/dist/src/clients/k8s-client.js +270 -0
- package/dist/src/clients/llm-client.js +119 -0
- package/dist/src/clients/rest-client.js +104 -0
- package/dist/src/clients/service-discovery.js +35 -0
- package/dist/src/clients/terraform-client.js +302 -0
- package/dist/src/clients/tools-client.js +1227 -0
- package/dist/src/clients/ws-client.js +93 -0
- package/dist/src/commands/alias.js +91 -0
- package/dist/src/commands/analyze/index.js +313 -0
- package/dist/src/commands/apply/helm.js +375 -0
- package/dist/src/commands/apply/index.js +176 -0
- package/dist/src/commands/apply/k8s.js +350 -0
- package/dist/src/commands/apply/terraform.js +465 -0
- package/dist/src/commands/ask.js +137 -0
- package/dist/src/commands/audit/index.js +322 -0
- package/dist/src/commands/auth-cloud.js +345 -0
- package/dist/src/commands/auth-list.js +112 -0
- package/dist/src/commands/auth-profile.js +104 -0
- package/dist/src/commands/auth-refresh.js +161 -0
- package/dist/src/commands/auth-status.js +122 -0
- package/dist/src/commands/aws/ec2.js +402 -0
- package/dist/src/commands/aws/iam.js +304 -0
- package/dist/src/commands/aws/index.js +108 -0
- package/dist/src/commands/aws/lambda.js +317 -0
- package/dist/src/commands/aws/rds.js +345 -0
- package/dist/src/commands/aws/s3.js +346 -0
- package/dist/src/commands/aws/vpc.js +302 -0
- package/dist/src/commands/aws-discover.js +413 -0
- package/dist/src/commands/aws-terraform.js +618 -0
- package/dist/src/commands/azure/aks.js +305 -0
- package/dist/src/commands/azure/functions.js +200 -0
- package/dist/src/commands/azure/index.js +93 -0
- package/dist/src/commands/azure/storage.js +378 -0
- package/dist/src/commands/azure/vm.js +291 -0
- package/dist/src/commands/billing/index.js +224 -0
- package/dist/src/commands/chat.js +259 -0
- package/dist/src/commands/completions.js +255 -0
- package/dist/src/commands/config.js +291 -0
- package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
- package/dist/src/commands/cost/estimator.js +73 -0
- package/dist/src/commands/cost/index.js +625 -0
- package/dist/src/commands/cost/parsers/terraform.js +234 -0
- package/dist/src/commands/cost/parsers/types.js +4 -0
- package/dist/src/commands/cost/pricing/aws.js +501 -0
- package/dist/src/commands/cost/pricing/azure.js +462 -0
- package/dist/src/commands/cost/pricing/gcp.js +359 -0
- package/dist/src/commands/cost/pricing/index.js +24 -0
- package/dist/src/commands/demo.js +196 -0
- package/dist/src/commands/deploy.js +215 -0
- package/dist/src/commands/doctor.js +1291 -0
- package/dist/src/commands/drift/index.js +674 -0
- package/dist/src/commands/explain.js +235 -0
- package/dist/src/commands/export.js +120 -0
- package/dist/src/commands/feedback.js +319 -0
- package/dist/src/commands/fix.js +263 -0
- package/dist/src/commands/fs/index.js +338 -0
- package/dist/src/commands/gcp/compute.js +266 -0
- package/dist/src/commands/gcp/functions.js +221 -0
- package/dist/src/commands/gcp/gke.js +357 -0
- package/dist/src/commands/gcp/iam.js +295 -0
- package/dist/src/commands/gcp/index.js +105 -0
- package/dist/src/commands/gcp/storage.js +232 -0
- package/dist/src/commands/generate-helm.js +1026 -0
- package/dist/src/commands/generate-k8s.js +1263 -0
- package/dist/src/commands/generate-terraform.js +1058 -0
- package/dist/src/commands/gh/index.js +663 -0
- package/dist/src/commands/git/index.js +1208 -0
- package/dist/src/commands/helm/index.js +985 -0
- package/dist/src/commands/help.js +639 -0
- package/dist/src/commands/history.js +120 -0
- package/dist/src/commands/import.js +782 -0
- package/dist/src/commands/incident.js +144 -0
- package/dist/src/commands/index.js +109 -0
- package/dist/src/commands/init.js +955 -0
- package/dist/src/commands/k8s/index.js +979 -0
- package/dist/src/commands/login.js +588 -0
- package/dist/src/commands/logout.js +61 -0
- package/dist/src/commands/logs.js +160 -0
- package/dist/src/commands/onboarding.js +382 -0
- package/dist/src/commands/pipeline.js +153 -0
- package/dist/src/commands/plan/display.js +216 -0
- package/dist/src/commands/plan/index.js +525 -0
- package/dist/src/commands/plugin.js +325 -0
- package/dist/src/commands/preview.js +356 -0
- package/dist/src/commands/profile.js +297 -0
- package/dist/src/commands/questionnaire.js +1021 -0
- package/dist/src/commands/resume.js +35 -0
- package/dist/src/commands/rollback.js +259 -0
- package/dist/src/commands/rollout.js +74 -0
- package/dist/src/commands/runbook.js +307 -0
- package/dist/src/commands/schedule.js +202 -0
- package/dist/src/commands/status.js +213 -0
- package/dist/src/commands/team/index.js +309 -0
- package/dist/src/commands/team-context.js +200 -0
- package/dist/src/commands/template.js +204 -0
- package/dist/src/commands/tf/index.js +989 -0
- package/dist/src/commands/upgrade.js +515 -0
- package/dist/src/commands/usage/index.js +118 -0
- package/dist/src/commands/version.js +145 -0
- package/dist/src/commands/watch.js +127 -0
- package/dist/src/compat/index.js +2 -0
- package/dist/src/compat/runtime.js +10 -0
- package/dist/src/compat/sqlite.js +144 -0
- package/dist/src/config/index.js +6 -0
- package/dist/src/config/manager.js +469 -0
- package/dist/src/config/mode-store.js +57 -0
- package/dist/src/config/profiles.js +66 -0
- package/dist/src/config/safety-policy.js +251 -0
- package/dist/src/config/schema.js +107 -0
- package/dist/src/config/types.js +311 -0
- package/dist/src/config/workspace-state.js +38 -0
- package/dist/src/context/context-db.js +138 -0
- package/dist/src/demo/index.js +295 -0
- package/dist/src/demo/scenarios/full-journey.js +226 -0
- package/dist/src/demo/scenarios/getting-started.js +124 -0
- package/dist/src/demo/scenarios/helm-release.js +334 -0
- package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
- package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
- package/dist/src/demo/types.js +6 -0
- package/dist/src/engine/cost-estimator.js +334 -0
- package/dist/src/engine/diagram-generator.js +192 -0
- package/dist/src/engine/drift-detector.js +688 -0
- package/dist/src/engine/executor.js +832 -0
- package/dist/src/engine/index.js +39 -0
- package/dist/src/engine/orchestrator.js +436 -0
- package/dist/src/engine/planner.js +616 -0
- package/dist/src/engine/safety.js +609 -0
- package/dist/src/engine/verifier.js +664 -0
- package/dist/src/enterprise/audit.js +241 -0
- package/dist/src/enterprise/auth.js +189 -0
- package/dist/src/enterprise/billing.js +512 -0
- package/dist/src/enterprise/index.js +16 -0
- package/dist/src/enterprise/teams.js +315 -0
- package/dist/src/generator/best-practices.js +1375 -0
- package/dist/src/generator/helm.js +495 -0
- package/dist/src/generator/index.js +11 -0
- package/dist/src/generator/intent-parser.js +420 -0
- package/dist/src/generator/kubernetes.js +773 -0
- package/dist/src/generator/terraform.js +1472 -0
- package/dist/src/history/index.js +6 -0
- package/dist/src/history/manager.js +199 -0
- package/dist/src/history/types.js +6 -0
- package/dist/src/hooks/config.js +318 -0
- package/dist/src/hooks/engine.js +317 -0
- package/dist/src/hooks/index.js +2 -0
- package/dist/src/llm/auth-bridge.js +157 -0
- package/dist/src/llm/circuit-breaker.js +116 -0
- package/dist/src/llm/config-loader.js +172 -0
- package/dist/src/llm/cost-calculator.js +137 -0
- package/dist/src/llm/index.js +7 -0
- package/dist/src/llm/model-aliases.js +99 -0
- package/dist/src/llm/provider-registry.js +57 -0
- package/dist/src/llm/providers/anthropic.js +430 -0
- package/dist/src/llm/providers/bedrock.js +409 -0
- package/dist/src/llm/providers/google.js +344 -0
- package/dist/src/llm/providers/ollama.js +661 -0
- package/dist/src/llm/providers/openai-compatible.js +289 -0
- package/dist/src/llm/providers/openai.js +284 -0
- package/dist/src/llm/providers/openrouter.js +293 -0
- package/dist/src/llm/router.js +844 -0
- package/dist/src/llm/types.js +69 -0
- package/dist/src/lsp/client.js +239 -0
- package/dist/src/lsp/languages.js +95 -0
- package/dist/src/lsp/manager.js +243 -0
- package/dist/src/mcp/client.js +289 -0
- package/dist/src/mcp/index.js +5 -0
- package/dist/src/mcp/manager.js +113 -0
- package/dist/src/nimbus.js +212 -0
- package/dist/src/plugins/index.js +13 -0
- package/dist/src/plugins/loader.js +280 -0
- package/dist/src/plugins/manager.js +282 -0
- package/dist/src/plugins/types.js +23 -0
- package/dist/src/scanners/cicd-scanner.js +230 -0
- package/dist/src/scanners/cloud-scanner.js +415 -0
- package/dist/src/scanners/framework-scanner.js +430 -0
- package/dist/src/scanners/iac-scanner.js +350 -0
- package/dist/src/scanners/index.js +454 -0
- package/dist/src/scanners/language-scanner.js +258 -0
- package/dist/src/scanners/package-manager-scanner.js +252 -0
- package/dist/src/scanners/types.js +6 -0
- package/dist/src/sessions/manager.js +395 -0
- package/dist/src/sessions/types.js +4 -0
- package/dist/src/sharing/sync.js +238 -0
- package/dist/src/sharing/viewer.js +131 -0
- package/dist/src/snapshots/index.js +1 -0
- package/dist/src/snapshots/manager.js +432 -0
- package/dist/src/state/artifacts.js +94 -0
- package/dist/src/state/audit.js +73 -0
- package/dist/src/state/billing.js +126 -0
- package/dist/src/state/checkpoints.js +81 -0
- package/dist/src/state/config.js +58 -0
- package/dist/src/state/conversations.js +7 -0
- package/dist/src/state/credentials.js +96 -0
- package/dist/src/state/db.js +53 -0
- package/dist/src/state/index.js +23 -0
- package/dist/src/state/messages.js +76 -0
- package/dist/src/state/projects.js +92 -0
- package/dist/src/state/schema.js +233 -0
- package/dist/src/state/sessions.js +79 -0
- package/dist/src/state/teams.js +131 -0
- package/dist/src/telemetry.js +91 -0
- package/dist/src/tools/aws-ops.js +747 -0
- package/dist/src/tools/azure-ops.js +491 -0
- package/dist/src/tools/file-ops.js +451 -0
- package/dist/src/tools/gcp-ops.js +559 -0
- package/dist/src/tools/git-ops.js +557 -0
- package/dist/src/tools/github-ops.js +460 -0
- package/dist/src/tools/helm-ops.js +634 -0
- package/dist/src/tools/index.js +16 -0
- package/dist/src/tools/k8s-ops.js +579 -0
- package/dist/src/tools/schemas/converter.js +129 -0
- package/dist/src/tools/schemas/devops.js +3319 -0
- package/dist/src/tools/schemas/index.js +19 -0
- package/dist/src/tools/schemas/standard.js +966 -0
- package/dist/src/tools/schemas/types.js +409 -0
- package/dist/src/tools/spawn-exec.js +109 -0
- package/dist/src/tools/terraform-ops.js +627 -0
- package/dist/src/types/config.js +1 -0
- package/dist/src/types/drift.js +4 -0
- package/dist/src/types/enterprise.js +5 -0
- package/dist/src/types/index.js +14 -0
- package/dist/src/types/plan.js +1 -0
- package/dist/src/types/request.js +1 -0
- package/dist/src/types/response.js +1 -0
- package/dist/src/types/service.js +1 -0
- package/dist/src/ui/App.js +1672 -0
- package/dist/src/ui/DeployPreview.js +60 -0
- package/dist/src/ui/FileDiffModal.js +108 -0
- package/dist/src/ui/Header.js +46 -0
- package/dist/src/ui/HelpModal.js +9 -0
- package/dist/src/ui/InputBox.js +408 -0
- package/dist/src/ui/MessageList.js +795 -0
- package/dist/src/ui/PermissionPrompt.js +72 -0
- package/dist/src/ui/StatusBar.js +109 -0
- package/dist/src/ui/TerminalPane.js +31 -0
- package/dist/src/ui/ToolCallDisplay.js +303 -0
- package/dist/src/ui/TreePane.js +83 -0
- package/dist/src/ui/chat-ui.js +721 -0
- package/dist/src/ui/index.js +11 -0
- package/dist/src/ui/ink/index.js +1325 -0
- package/dist/src/ui/streaming.js +137 -0
- package/dist/src/ui/theme.js +78 -0
- package/dist/src/ui/types.js +7 -0
- package/dist/src/utils/analytics.js +61 -0
- package/dist/src/utils/cost-warning.js +25 -0
- package/dist/src/utils/env.js +42 -0
- package/dist/src/utils/errors.js +54 -0
- package/dist/src/utils/event-bus.js +22 -0
- package/dist/src/utils/index.js +16 -0
- package/dist/src/utils/logger.js +150 -0
- package/dist/src/utils/rate-limiter.js +90 -0
- package/dist/src/utils/service-auth.js +36 -0
- package/dist/src/utils/validation.js +39 -0
- package/dist/src/version.js +3 -0
- package/dist/src/watcher/index.js +192 -0
- package/dist/src/wizard/approval.js +275 -0
- package/dist/src/wizard/index.js +13 -0
- package/dist/src/wizard/prompts.js +273 -0
- package/dist/src/wizard/types.js +4 -0
- package/dist/src/wizard/ui.js +453 -0
- package/dist/src/wizard/wizard.js +227 -0
- package/package.json +31 -23
- package/src/__tests__/alias.test.ts +133 -0
- package/src/__tests__/app.test.ts +1 -1
- package/src/__tests__/audit.test.ts +1 -1
- package/src/__tests__/circuit-breaker.test.ts +1 -1
- package/src/__tests__/cli-run.test.ts +237 -1
- package/src/__tests__/compat-sqlite.test.ts +68 -0
- package/src/__tests__/context-manager.test.ts +131 -1
- package/src/__tests__/context.test.ts +1 -1
- package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
- package/src/__tests__/doctor.test.ts +48 -0
- package/src/__tests__/enterprise.test.ts +1 -1
- package/src/__tests__/export.test.ts +236 -0
- package/src/__tests__/gap-11-18-20.test.ts +958 -0
- package/src/__tests__/generator.test.ts +1 -1
- package/src/__tests__/helm-streaming.test.ts +127 -0
- package/src/__tests__/hooks.test.ts +1 -1
- package/src/__tests__/incident.test.ts +179 -0
- package/src/__tests__/init.test.ts +55 -4
- package/src/__tests__/intent-parser.test.ts +1 -1
- package/src/__tests__/llm-router.test.ts +1 -1
- package/src/__tests__/logs.test.ts +107 -0
- package/src/__tests__/loop-errors.test.ts +244 -0
- package/src/__tests__/lsp.test.ts +1 -1
- package/src/__tests__/modes.test.ts +1 -1
- package/src/__tests__/perf-optimizations.test.ts +847 -0
- package/src/__tests__/permissions.test.ts +1 -1
- package/src/__tests__/pipeline.test.ts +50 -0
- package/src/__tests__/polish-phase3.test.ts +340 -0
- package/src/__tests__/profile.test.ts +237 -0
- package/src/__tests__/rollback.test.ts +83 -0
- package/src/__tests__/runbook.test.ts +219 -0
- package/src/__tests__/schedule.test.ts +206 -0
- package/src/__tests__/serve.test.ts +1 -1
- package/src/__tests__/sessions.test.ts +96 -1
- package/src/__tests__/sharing.test.ts +53 -1
- package/src/__tests__/snapshots.test.ts +1 -1
- package/src/__tests__/standalone-migration.test.ts +199 -0
- package/src/__tests__/state-db.test.ts +1 -1
- package/src/__tests__/status.test.ts +158 -0
- package/src/__tests__/stream-with-tools.test.ts +71 -25
- package/src/__tests__/subagents.test.ts +1 -1
- package/src/__tests__/system-prompt.test.ts +82 -3
- package/src/__tests__/terminal-gap-v2.test.ts +395 -0
- package/src/__tests__/terminal-parity.test.ts +393 -0
- package/src/__tests__/tf-apply.test.ts +187 -0
- package/src/__tests__/tool-converter.test.ts +1 -1
- package/src/__tests__/tool-schemas.test.ts +209 -4
- package/src/__tests__/tools.test.ts +4 -3
- package/src/__tests__/version-json.test.ts +184 -0
- package/src/__tests__/version.test.ts +1 -1
- package/src/__tests__/watch.test.ts +129 -0
- package/src/agent/compaction-agent.ts +40 -1
- package/src/agent/context-manager.ts +67 -3
- package/src/agent/deploy-preview.ts +62 -1
- package/src/agent/expand-files.ts +108 -0
- package/src/agent/loop.ts +1312 -31
- package/src/agent/permissions.ts +51 -4
- package/src/agent/system-prompt.ts +573 -19
- package/src/app.ts +58 -0
- package/src/audit/security-scanner.ts +45 -0
- package/src/auth/keychain.ts +82 -0
- package/src/auth/oauth.ts +15 -5
- package/src/cli/init.ts +378 -5
- package/src/cli/run.ts +407 -16
- package/src/cli/serve.ts +78 -1
- package/src/cli/web.ts +10 -6
- package/src/cli.ts +312 -1
- package/src/clients/service-discovery.ts +30 -25
- package/src/commands/alias.ts +100 -0
- package/src/commands/audit/index.ts +121 -2
- package/src/commands/auth-cloud.ts +113 -0
- package/src/commands/auth-refresh.ts +187 -0
- package/src/commands/aws-discover.ts +144 -251
- package/src/commands/aws-terraform.ts +68 -118
- package/src/commands/chat.ts +9 -3
- package/src/commands/completions.ts +268 -0
- package/src/commands/config.ts +26 -0
- package/src/commands/cost/index.ts +218 -2
- package/src/commands/deploy.ts +260 -0
- package/src/commands/doctor.ts +744 -152
- package/src/commands/drift/index.ts +371 -23
- package/src/commands/export.ts +146 -0
- package/src/commands/generate-k8s.ts +9 -61
- package/src/commands/generate-terraform.ts +191 -449
- package/src/commands/help.ts +212 -36
- package/src/commands/history.ts +8 -1
- package/src/commands/incident.ts +166 -0
- package/src/commands/init.ts +5 -0
- package/src/commands/login.ts +86 -1
- package/src/commands/logs.ts +167 -0
- package/src/commands/onboarding.ts +211 -34
- package/src/commands/pipeline.ts +186 -0
- package/src/commands/plugin.ts +398 -0
- package/src/commands/profile.ts +342 -0
- package/src/commands/questionnaire.ts +0 -98
- package/src/commands/resume.ts +26 -34
- package/src/commands/rollback.ts +315 -0
- package/src/commands/rollout.ts +88 -0
- package/src/commands/runbook.ts +346 -0
- package/src/commands/schedule.ts +236 -0
- package/src/commands/status.ts +252 -0
- package/src/commands/team-context.ts +220 -0
- package/src/commands/template.ts +58 -57
- package/src/commands/tf/index.ts +70 -11
- package/src/commands/upgrade.ts +57 -0
- package/src/commands/version.ts +54 -50
- package/src/commands/watch.ts +153 -0
- package/src/compat/runtime.ts +1 -1
- package/src/compat/sqlite.ts +75 -5
- package/src/config/mode-store.ts +62 -0
- package/src/config/profiles.ts +84 -0
- package/src/config/types.ts +83 -1
- package/src/config/workspace-state.ts +53 -0
- package/src/engine/cost-estimator.ts +52 -10
- package/src/engine/executor.ts +33 -2
- package/src/engine/planner.ts +68 -1
- package/src/generator/terraform.ts +8 -0
- package/src/history/manager.ts +2 -74
- package/src/hooks/engine.ts +5 -4
- package/src/llm/cost-calculator.ts +2 -2
- package/src/llm/providers/anthropic.ts +50 -21
- package/src/llm/router.ts +76 -7
- package/src/lsp/languages.ts +3 -0
- package/src/lsp/manager.ts +21 -5
- package/src/nimbus.ts +37 -18
- package/src/sessions/manager.ts +108 -1
- package/src/sharing/sync.ts +4 -0
- package/src/sharing/viewer.ts +66 -0
- package/src/tools/file-ops.ts +22 -0
- package/src/tools/schemas/devops.ts +3007 -117
- package/src/tools/schemas/standard.ts +5 -1
- package/src/tools/schemas/types.ts +31 -1
- package/src/tools/spawn-exec.ts +148 -0
- package/src/ui/App.tsx +1183 -66
- package/src/ui/DeployPreview.tsx +62 -57
- package/src/ui/FileDiffModal.tsx +162 -0
- package/src/ui/Header.tsx +87 -24
- package/src/ui/HelpModal.tsx +57 -0
- package/src/ui/InputBox.tsx +163 -10
- package/src/ui/MessageList.tsx +487 -40
- package/src/ui/PermissionPrompt.tsx +17 -5
- package/src/ui/StatusBar.tsx +122 -3
- package/src/ui/TerminalPane.tsx +84 -0
- package/src/ui/ToolCallDisplay.tsx +252 -18
- package/src/ui/TreePane.tsx +132 -0
- package/src/ui/chat-ui.ts +41 -44
- package/src/ui/ink/index.ts +771 -38
- package/src/ui/streaming.ts +1 -1
- package/src/ui/theme.ts +104 -0
- package/src/ui/types.ts +18 -0
- package/src/version.ts +1 -1
- package/src/watcher/index.ts +66 -15
- package/src/wizard/types.ts +1 -0
- package/src/wizard/ui.ts +1 -1
- package/tsconfig.json +2 -2
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Tools Client
|
|
3
|
+
*
|
|
4
|
+
* REST client for communicating with the Git Tools Service
|
|
5
|
+
*/
|
|
6
|
+
import { RestClient, ServiceURLs } from '.';
|
|
7
|
+
/**
|
|
8
|
+
* Client for Git Tools Service
|
|
9
|
+
*/
|
|
10
|
+
export class GitClient {
|
|
11
|
+
client;
|
|
12
|
+
constructor(baseUrl) {
|
|
13
|
+
this.client = new RestClient(baseUrl || ServiceURLs.GIT_TOOLS);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get git status
|
|
17
|
+
*/
|
|
18
|
+
async status(directory) {
|
|
19
|
+
const params = new URLSearchParams();
|
|
20
|
+
if (directory) {
|
|
21
|
+
params.set('directory', directory);
|
|
22
|
+
}
|
|
23
|
+
const response = await this.client.get(`/api/git/status?${params.toString()}`);
|
|
24
|
+
if (response.success && response.data) {
|
|
25
|
+
return response.data;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
status: {
|
|
30
|
+
branch: '',
|
|
31
|
+
ahead: 0,
|
|
32
|
+
behind: 0,
|
|
33
|
+
staged: [],
|
|
34
|
+
modified: [],
|
|
35
|
+
untracked: [],
|
|
36
|
+
deleted: [],
|
|
37
|
+
},
|
|
38
|
+
error: response.error?.message || 'Unknown error',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Stage files
|
|
43
|
+
*/
|
|
44
|
+
async add(files, options) {
|
|
45
|
+
const response = await this.client.post('/api/git/add', { files, ...options });
|
|
46
|
+
if (response.success && response.data) {
|
|
47
|
+
return response.data;
|
|
48
|
+
}
|
|
49
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a commit
|
|
53
|
+
*/
|
|
54
|
+
async commit(message, options) {
|
|
55
|
+
const response = await this.client.post('/api/git/commit', { message, ...options });
|
|
56
|
+
if (response.success && response.data) {
|
|
57
|
+
return response.data;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
commit: { hash: '', shortHash: '', message: '', author: '', date: '' },
|
|
62
|
+
error: response.error?.message || 'Unknown error',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Push to remote
|
|
67
|
+
*/
|
|
68
|
+
async push(options) {
|
|
69
|
+
const response = await this.client.post('/api/git/push', options || {});
|
|
70
|
+
if (response.success && response.data) {
|
|
71
|
+
return response.data;
|
|
72
|
+
}
|
|
73
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Pull from remote
|
|
77
|
+
*/
|
|
78
|
+
async pull(options) {
|
|
79
|
+
const response = await this.client.post('/api/git/pull', options || {});
|
|
80
|
+
if (response.success && response.data) {
|
|
81
|
+
return response.data;
|
|
82
|
+
}
|
|
83
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Fetch from remote
|
|
87
|
+
*/
|
|
88
|
+
async fetch(options) {
|
|
89
|
+
const response = await this.client.post('/api/git/fetch', options || {});
|
|
90
|
+
if (response.success && response.data) {
|
|
91
|
+
return response.data;
|
|
92
|
+
}
|
|
93
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get commit log
|
|
97
|
+
*/
|
|
98
|
+
async log(options) {
|
|
99
|
+
const params = new URLSearchParams();
|
|
100
|
+
if (options?.directory) {
|
|
101
|
+
params.set('directory', options.directory);
|
|
102
|
+
}
|
|
103
|
+
if (options?.limit) {
|
|
104
|
+
params.set('limit', String(options.limit));
|
|
105
|
+
}
|
|
106
|
+
if (options?.branch) {
|
|
107
|
+
params.set('branch', options.branch);
|
|
108
|
+
}
|
|
109
|
+
const response = await this.client.get(`/api/git/log?${params.toString()}`);
|
|
110
|
+
if (response.success && response.data) {
|
|
111
|
+
return response.data;
|
|
112
|
+
}
|
|
113
|
+
return { success: false, commits: [], error: response.error?.message || 'Unknown error' };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* List branches
|
|
117
|
+
*/
|
|
118
|
+
async branches(options) {
|
|
119
|
+
const params = new URLSearchParams();
|
|
120
|
+
if (options?.directory) {
|
|
121
|
+
params.set('directory', options.directory);
|
|
122
|
+
}
|
|
123
|
+
if (options?.all) {
|
|
124
|
+
params.set('all', 'true');
|
|
125
|
+
}
|
|
126
|
+
const response = await this.client.get(`/api/git/branches?${params.toString()}`);
|
|
127
|
+
if (response.success && response.data) {
|
|
128
|
+
return response.data;
|
|
129
|
+
}
|
|
130
|
+
return { success: false, branches: [], error: response.error?.message || 'Unknown error' };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Checkout branch or file
|
|
134
|
+
*/
|
|
135
|
+
async checkout(target, options) {
|
|
136
|
+
const response = await this.client.post('/api/git/checkout', { target, ...options });
|
|
137
|
+
if (response.success && response.data) {
|
|
138
|
+
return response.data;
|
|
139
|
+
}
|
|
140
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get diff
|
|
144
|
+
*/
|
|
145
|
+
async diff(options) {
|
|
146
|
+
const params = new URLSearchParams();
|
|
147
|
+
if (options?.directory) {
|
|
148
|
+
params.set('directory', options.directory);
|
|
149
|
+
}
|
|
150
|
+
if (options?.staged) {
|
|
151
|
+
params.set('staged', 'true');
|
|
152
|
+
}
|
|
153
|
+
if (options?.file) {
|
|
154
|
+
params.set('file', options.file);
|
|
155
|
+
}
|
|
156
|
+
const response = await this.client.get(`/api/git/diff?${params.toString()}`);
|
|
157
|
+
if (response.success && response.data) {
|
|
158
|
+
return response.data;
|
|
159
|
+
}
|
|
160
|
+
return { success: false, diff: '', error: response.error?.message || 'Unknown error' };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Merge a branch
|
|
164
|
+
*/
|
|
165
|
+
async merge(branch, options) {
|
|
166
|
+
const response = await this.client.post('/api/git/merge', { branch, ...options });
|
|
167
|
+
if (response.success && response.data) {
|
|
168
|
+
return response.data;
|
|
169
|
+
}
|
|
170
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Stash operations
|
|
174
|
+
*/
|
|
175
|
+
async stash(command, options) {
|
|
176
|
+
const response = await this.client.post('/api/git/stash', { command, ...options });
|
|
177
|
+
if (response.success && response.data) {
|
|
178
|
+
return response.data;
|
|
179
|
+
}
|
|
180
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Clone a repository
|
|
184
|
+
*/
|
|
185
|
+
async clone(url, targetPath, options) {
|
|
186
|
+
const response = await this.client.post('/api/git/clone', { url, path: targetPath, ...options });
|
|
187
|
+
if (response.success && response.data) {
|
|
188
|
+
return response.data;
|
|
189
|
+
}
|
|
190
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Tag operations
|
|
194
|
+
*/
|
|
195
|
+
async tagCreate(name, options) {
|
|
196
|
+
const response = await this.client.post('/api/git/tag', { name, path: options?.directory, ...options });
|
|
197
|
+
if (response.success && response.data) {
|
|
198
|
+
return response.data;
|
|
199
|
+
}
|
|
200
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
201
|
+
}
|
|
202
|
+
async tagDelete(name, options) {
|
|
203
|
+
const params = new URLSearchParams();
|
|
204
|
+
params.set('name', name);
|
|
205
|
+
if (options?.directory) {
|
|
206
|
+
params.set('path', options.directory);
|
|
207
|
+
}
|
|
208
|
+
const response = await this.client.delete(`/api/git/tag?${params.toString()}`);
|
|
209
|
+
if (response.success && response.data) {
|
|
210
|
+
return response.data;
|
|
211
|
+
}
|
|
212
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
213
|
+
}
|
|
214
|
+
async tagList(options) {
|
|
215
|
+
const params = new URLSearchParams();
|
|
216
|
+
if (options?.directory) {
|
|
217
|
+
params.set('path', options.directory);
|
|
218
|
+
}
|
|
219
|
+
if (options?.pattern) {
|
|
220
|
+
params.set('pattern', options.pattern);
|
|
221
|
+
}
|
|
222
|
+
const response = await this.client.get(`/api/git/tags?${params.toString()}`);
|
|
223
|
+
if (response.success && response.data) {
|
|
224
|
+
const data = response.data;
|
|
225
|
+
return { success: true, tags: data?.data?.tags || data?.tags || [] };
|
|
226
|
+
}
|
|
227
|
+
return { success: false, tags: [], error: response.error?.message || 'Unknown error' };
|
|
228
|
+
}
|
|
229
|
+
async tagPush(options) {
|
|
230
|
+
const response = await this.client.post('/api/git/tag/push', { path: options?.directory, remote: options?.remote, tagName: options?.tagName });
|
|
231
|
+
if (response.success && response.data) {
|
|
232
|
+
return response.data;
|
|
233
|
+
}
|
|
234
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
235
|
+
}
|
|
236
|
+
async tagShow(name, options) {
|
|
237
|
+
const params = new URLSearchParams();
|
|
238
|
+
params.set('name', name);
|
|
239
|
+
if (options?.directory) {
|
|
240
|
+
params.set('path', options.directory);
|
|
241
|
+
}
|
|
242
|
+
const response = await this.client.get(`/api/git/tag/show?${params.toString()}`);
|
|
243
|
+
if (response.success && response.data) {
|
|
244
|
+
return response.data;
|
|
245
|
+
}
|
|
246
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get remote URL
|
|
250
|
+
*/
|
|
251
|
+
async remote(remoteName, options) {
|
|
252
|
+
const params = new URLSearchParams();
|
|
253
|
+
if (options?.directory) {
|
|
254
|
+
params.set('path', options.directory);
|
|
255
|
+
}
|
|
256
|
+
if (remoteName) {
|
|
257
|
+
params.set('name', remoteName);
|
|
258
|
+
}
|
|
259
|
+
const response = await this.client.get(`/api/git/remote?${params.toString()}`);
|
|
260
|
+
if (response.success && response.data) {
|
|
261
|
+
const data = response.data;
|
|
262
|
+
return {
|
|
263
|
+
success: true,
|
|
264
|
+
remote: data?.data?.remote || data?.remote || remoteName || 'origin',
|
|
265
|
+
url: data?.data?.url !== undefined ? data.data.url : data?.url,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
success: false,
|
|
270
|
+
remote: remoteName || 'origin',
|
|
271
|
+
url: null,
|
|
272
|
+
error: response.error?.message || 'Unknown error',
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Reset to a commit
|
|
277
|
+
*/
|
|
278
|
+
async reset(target, options) {
|
|
279
|
+
const response = await this.client.post('/api/git/reset', { target, path: options?.directory, mode: options?.mode });
|
|
280
|
+
if (response.success && response.data) {
|
|
281
|
+
return response.data;
|
|
282
|
+
}
|
|
283
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Revert a commit
|
|
287
|
+
*/
|
|
288
|
+
async revert(commit, options) {
|
|
289
|
+
const response = await this.client.post('/api/git/revert', { commit, cwd: options?.directory, noCommit: options?.noCommit, noEdit: options?.noEdit });
|
|
290
|
+
if (response.success && response.data) {
|
|
291
|
+
return response.data;
|
|
292
|
+
}
|
|
293
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Cherry-pick operations
|
|
297
|
+
*/
|
|
298
|
+
async cherryPick(commit, options) {
|
|
299
|
+
const response = await this.client.post('/api/git/cherry-pick', { commit, path: options?.directory, noCommit: options?.noCommit });
|
|
300
|
+
if (response.success && response.data) {
|
|
301
|
+
return response.data;
|
|
302
|
+
}
|
|
303
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
304
|
+
}
|
|
305
|
+
async cherryPickAbort(options) {
|
|
306
|
+
const response = await this.client.post('/api/git/cherry-pick/abort', { path: options?.directory });
|
|
307
|
+
if (response.success && response.data) {
|
|
308
|
+
return response.data;
|
|
309
|
+
}
|
|
310
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
311
|
+
}
|
|
312
|
+
async cherryPickContinue(options) {
|
|
313
|
+
const response = await this.client.post('/api/git/cherry-pick/continue', { path: options?.directory });
|
|
314
|
+
if (response.success && response.data) {
|
|
315
|
+
return response.data;
|
|
316
|
+
}
|
|
317
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Blame a file
|
|
321
|
+
*/
|
|
322
|
+
async blame(file, options) {
|
|
323
|
+
const params = new URLSearchParams();
|
|
324
|
+
params.set('file', file);
|
|
325
|
+
if (options?.directory) {
|
|
326
|
+
params.set('path', options.directory);
|
|
327
|
+
}
|
|
328
|
+
if (options?.lineRange) {
|
|
329
|
+
const parts = options.lineRange.split(',');
|
|
330
|
+
if (parts[0]) {
|
|
331
|
+
params.set('startLine', parts[0].trim());
|
|
332
|
+
}
|
|
333
|
+
if (parts[1]) {
|
|
334
|
+
params.set('endLine', parts[1].trim());
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const response = await this.client.get(`/api/git/blame?${params.toString()}`);
|
|
338
|
+
if (response.success && response.data) {
|
|
339
|
+
const data = response.data;
|
|
340
|
+
return { success: true, blame: data?.data?.blame || data?.blame || [] };
|
|
341
|
+
}
|
|
342
|
+
return { success: false, blame: [], error: response.error?.message || 'Unknown error' };
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Initialize a repository
|
|
346
|
+
*/
|
|
347
|
+
async init(options) {
|
|
348
|
+
const response = await this.client.post('/api/git/init', { path: options?.directory, bare: options?.bare });
|
|
349
|
+
if (response.success && response.data) {
|
|
350
|
+
return response.data;
|
|
351
|
+
}
|
|
352
|
+
return { success: false, output: '', error: response.error?.message || 'Unknown error' };
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Check if service is available
|
|
356
|
+
*/
|
|
357
|
+
async isAvailable() {
|
|
358
|
+
try {
|
|
359
|
+
const response = await this.client.get('/health');
|
|
360
|
+
return response.success && response.data?.status === 'healthy';
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
export const gitClient = new GitClient();
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Tools Client
|
|
3
|
+
*
|
|
4
|
+
* REST client for communicating with the GitHub Tools Service
|
|
5
|
+
*/
|
|
6
|
+
import { RestClient, ServiceURLs } from '.';
|
|
7
|
+
import { authStore } from '../auth/store';
|
|
8
|
+
/**
|
|
9
|
+
* Client for GitHub Tools Service
|
|
10
|
+
*/
|
|
11
|
+
export class GitHubClient {
|
|
12
|
+
client;
|
|
13
|
+
baseUrl;
|
|
14
|
+
constructor(baseUrl) {
|
|
15
|
+
this.baseUrl = baseUrl || ServiceURLs.GITHUB_TOOLS;
|
|
16
|
+
this.client = new RestClient(this.baseUrl);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get authorization header from stored GitHub identity
|
|
20
|
+
*/
|
|
21
|
+
getAuthHeader() {
|
|
22
|
+
const identity = authStore.getIdentity();
|
|
23
|
+
if (identity?.accessToken) {
|
|
24
|
+
return { Authorization: `Bearer ${identity.accessToken}` };
|
|
25
|
+
}
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a REST client with auth headers
|
|
30
|
+
*/
|
|
31
|
+
getAuthClient() {
|
|
32
|
+
const authHeaders = this.getAuthHeader();
|
|
33
|
+
return new RestClient(this.baseUrl, {
|
|
34
|
+
headers: authHeaders,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get authenticated user info
|
|
39
|
+
*/
|
|
40
|
+
async getUser() {
|
|
41
|
+
const client = this.getAuthClient();
|
|
42
|
+
const response = await client.get('/api/github/user');
|
|
43
|
+
if (response.success && response.data) {
|
|
44
|
+
return response.data;
|
|
45
|
+
}
|
|
46
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* List pull requests
|
|
50
|
+
*/
|
|
51
|
+
async listPRs(owner, repo, options) {
|
|
52
|
+
const client = this.getAuthClient();
|
|
53
|
+
const params = new URLSearchParams();
|
|
54
|
+
params.set('owner', owner);
|
|
55
|
+
params.set('repo', repo);
|
|
56
|
+
if (options?.state) {
|
|
57
|
+
params.set('state', options.state);
|
|
58
|
+
}
|
|
59
|
+
if (options?.perPage) {
|
|
60
|
+
params.set('per_page', String(options.perPage));
|
|
61
|
+
}
|
|
62
|
+
const response = await client.get(`/api/github/prs?${params.toString()}`);
|
|
63
|
+
if (response.success && response.data) {
|
|
64
|
+
return response.data;
|
|
65
|
+
}
|
|
66
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get a single pull request
|
|
70
|
+
*/
|
|
71
|
+
async getPR(owner, repo, prNumber) {
|
|
72
|
+
const client = this.getAuthClient();
|
|
73
|
+
const params = new URLSearchParams();
|
|
74
|
+
params.set('owner', owner);
|
|
75
|
+
params.set('repo', repo);
|
|
76
|
+
const response = await client.get(`/api/github/prs/${prNumber}?${params.toString()}`);
|
|
77
|
+
if (response.success && response.data) {
|
|
78
|
+
return response.data;
|
|
79
|
+
}
|
|
80
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create a pull request
|
|
84
|
+
*/
|
|
85
|
+
async createPR(owner, repo, params) {
|
|
86
|
+
const client = this.getAuthClient();
|
|
87
|
+
const response = await client.post('/api/github/prs', { owner, repo, ...params });
|
|
88
|
+
if (response.success && response.data) {
|
|
89
|
+
return response.data;
|
|
90
|
+
}
|
|
91
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Merge a pull request
|
|
95
|
+
*/
|
|
96
|
+
async mergePR(owner, repo, prNumber, options) {
|
|
97
|
+
const client = this.getAuthClient();
|
|
98
|
+
const response = await client.post(`/api/github/prs/${prNumber}/merge`, { owner, repo, ...options });
|
|
99
|
+
if (response.success && response.data) {
|
|
100
|
+
return response.data;
|
|
101
|
+
}
|
|
102
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create a review on a pull request
|
|
106
|
+
*/
|
|
107
|
+
async createPRReview(owner, repo, prNumber, event, body) {
|
|
108
|
+
const client = this.getAuthClient();
|
|
109
|
+
const response = await client.post(`/api/github/prs/${prNumber}/reviews`, { owner, repo, event, body });
|
|
110
|
+
if (response.success && response.data) {
|
|
111
|
+
return response.data;
|
|
112
|
+
}
|
|
113
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* List issues
|
|
117
|
+
*/
|
|
118
|
+
async listIssues(owner, repo, options) {
|
|
119
|
+
const client = this.getAuthClient();
|
|
120
|
+
const params = new URLSearchParams();
|
|
121
|
+
params.set('owner', owner);
|
|
122
|
+
params.set('repo', repo);
|
|
123
|
+
if (options?.state) {
|
|
124
|
+
params.set('state', options.state);
|
|
125
|
+
}
|
|
126
|
+
if (options?.perPage) {
|
|
127
|
+
params.set('per_page', String(options.perPage));
|
|
128
|
+
}
|
|
129
|
+
const response = await client.get(`/api/github/issues?${params.toString()}`);
|
|
130
|
+
if (response.success && response.data) {
|
|
131
|
+
return response.data;
|
|
132
|
+
}
|
|
133
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get a single issue
|
|
137
|
+
*/
|
|
138
|
+
async getIssue(owner, repo, issueNumber) {
|
|
139
|
+
const client = this.getAuthClient();
|
|
140
|
+
const params = new URLSearchParams();
|
|
141
|
+
params.set('owner', owner);
|
|
142
|
+
params.set('repo', repo);
|
|
143
|
+
const response = await client.get(`/api/github/issues/${issueNumber}?${params.toString()}`);
|
|
144
|
+
if (response.success && response.data) {
|
|
145
|
+
return response.data;
|
|
146
|
+
}
|
|
147
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create an issue
|
|
151
|
+
*/
|
|
152
|
+
async createIssue(owner, repo, params) {
|
|
153
|
+
const client = this.getAuthClient();
|
|
154
|
+
const response = await client.post('/api/github/issues', { owner, repo, ...params });
|
|
155
|
+
if (response.success && response.data) {
|
|
156
|
+
return response.data;
|
|
157
|
+
}
|
|
158
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Close an issue
|
|
162
|
+
*/
|
|
163
|
+
async closeIssue(owner, repo, issueNumber) {
|
|
164
|
+
const client = this.getAuthClient();
|
|
165
|
+
const params = new URLSearchParams();
|
|
166
|
+
params.set('owner', owner);
|
|
167
|
+
params.set('repo', repo);
|
|
168
|
+
const response = await client.put(`/api/github/issues/${issueNumber}/close?${params.toString()}`, {});
|
|
169
|
+
if (response.success && response.data) {
|
|
170
|
+
return response.data;
|
|
171
|
+
}
|
|
172
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Add a comment to an issue or PR
|
|
176
|
+
*/
|
|
177
|
+
async addComment(owner, repo, issueNumber, body) {
|
|
178
|
+
const client = this.getAuthClient();
|
|
179
|
+
const response = await client.post(`/api/github/issues/${issueNumber}/comments`, { owner, repo, body });
|
|
180
|
+
if (response.success && response.data) {
|
|
181
|
+
return response.data;
|
|
182
|
+
}
|
|
183
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get repository info
|
|
187
|
+
*/
|
|
188
|
+
async getRepo(owner, repo) {
|
|
189
|
+
const client = this.getAuthClient();
|
|
190
|
+
const params = new URLSearchParams();
|
|
191
|
+
params.set('owner', owner);
|
|
192
|
+
params.set('repo', repo);
|
|
193
|
+
const response = await client.get(`/api/github/repos?${params.toString()}`);
|
|
194
|
+
if (response.success && response.data) {
|
|
195
|
+
return response.data;
|
|
196
|
+
}
|
|
197
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* List branches
|
|
201
|
+
*/
|
|
202
|
+
async listBranches(owner, repo, options) {
|
|
203
|
+
const client = this.getAuthClient();
|
|
204
|
+
const params = new URLSearchParams();
|
|
205
|
+
params.set('owner', owner);
|
|
206
|
+
params.set('repo', repo);
|
|
207
|
+
if (options?.perPage) {
|
|
208
|
+
params.set('per_page', String(options.perPage));
|
|
209
|
+
}
|
|
210
|
+
const response = await client.get(`/api/github/repos/branches?${params.toString()}`);
|
|
211
|
+
if (response.success && response.data) {
|
|
212
|
+
return response.data;
|
|
213
|
+
}
|
|
214
|
+
return { success: false, error: response.error?.message || 'Unknown error' };
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if service is available
|
|
218
|
+
*/
|
|
219
|
+
async isAvailable() {
|
|
220
|
+
try {
|
|
221
|
+
const response = await this.client.get('/health');
|
|
222
|
+
return response.success && response.data?.status === 'healthy';
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
export const githubClient = new GitHubClient();
|