byterover-cli 2.6.0 → 3.0.1
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/.env.production +1 -0
- package/README.md +240 -14
- package/dist/agent/core/domain/knowledge/conflict-detector.d.ts +38 -0
- package/dist/agent/core/domain/knowledge/conflict-detector.js +71 -0
- package/dist/agent/core/domain/knowledge/conflict-resolver.d.ts +17 -0
- package/dist/agent/core/domain/knowledge/conflict-resolver.js +118 -0
- package/dist/agent/core/domain/knowledge/utils.d.ts +4 -0
- package/dist/agent/core/domain/knowledge/utils.js +6 -0
- package/dist/agent/core/interfaces/i-curate-service.d.ts +6 -0
- package/dist/agent/infra/tools/implementations/curate-tool.d.ts +67 -34
- package/dist/agent/infra/tools/implementations/curate-tool.js +294 -47
- package/dist/agent/resources/prompts/system-prompt.yml +15 -8
- package/dist/agent/resources/tools/code_exec.txt +3 -0
- package/dist/agent/resources/tools/curate.txt +12 -3
- package/dist/oclif/commands/connectors/install.d.ts +2 -1
- package/dist/oclif/commands/connectors/install.js +38 -3
- package/dist/oclif/commands/curate/index.d.ts +18 -0
- package/dist/oclif/commands/curate/index.js +78 -1
- package/dist/oclif/commands/init.d.ts +12 -0
- package/dist/oclif/commands/init.js +75 -0
- package/dist/oclif/commands/locations.js +1 -1
- package/dist/oclif/commands/providers/connect.d.ts +31 -1
- package/dist/oclif/commands/providers/connect.js +307 -27
- package/dist/oclif/commands/pull.d.ts +1 -0
- package/dist/oclif/commands/pull.js +7 -0
- package/dist/oclif/commands/push.d.ts +1 -0
- package/dist/oclif/commands/push.js +8 -0
- package/dist/oclif/commands/review/approve.d.ts +17 -0
- package/dist/oclif/commands/review/approve.js +37 -0
- package/dist/oclif/commands/review/base-review-decision.d.ts +18 -0
- package/dist/oclif/commands/review/base-review-decision.js +71 -0
- package/dist/oclif/commands/review/pending.d.ts +13 -0
- package/dist/oclif/commands/review/pending.js +94 -0
- package/dist/oclif/commands/review/reject.d.ts +17 -0
- package/dist/oclif/commands/review/reject.js +38 -0
- package/dist/oclif/commands/space/list.d.ts +2 -2
- package/dist/oclif/commands/space/list.js +13 -35
- package/dist/oclif/commands/space/switch.d.ts +2 -7
- package/dist/oclif/commands/space/switch.js +13 -56
- package/dist/oclif/commands/status.d.ts +1 -0
- package/dist/oclif/commands/status.js +11 -1
- package/dist/oclif/commands/vc/add.d.ts +7 -0
- package/dist/oclif/commands/vc/add.js +29 -0
- package/dist/oclif/commands/vc/branch.d.ts +15 -0
- package/dist/oclif/commands/vc/branch.js +70 -0
- package/dist/oclif/commands/vc/checkout.d.ts +14 -0
- package/dist/oclif/commands/vc/checkout.js +47 -0
- package/dist/oclif/commands/vc/clone.d.ts +9 -0
- package/dist/oclif/commands/vc/clone.js +61 -0
- package/dist/oclif/commands/vc/commit.d.ts +10 -0
- package/dist/oclif/commands/vc/commit.js +32 -0
- package/dist/oclif/commands/vc/config.d.ts +10 -0
- package/dist/oclif/commands/vc/config.js +30 -0
- package/dist/oclif/commands/vc/fetch.d.ts +10 -0
- package/dist/oclif/commands/vc/fetch.js +42 -0
- package/dist/oclif/commands/vc/index.d.ts +6 -0
- package/dist/oclif/commands/vc/index.js +8 -0
- package/dist/oclif/commands/vc/init.d.ts +6 -0
- package/dist/oclif/commands/vc/init.js +25 -0
- package/dist/oclif/commands/vc/log.d.ts +13 -0
- package/dist/oclif/commands/vc/log.js +48 -0
- package/dist/oclif/commands/vc/merge.d.ts +19 -0
- package/dist/oclif/commands/vc/merge.js +130 -0
- package/dist/oclif/commands/vc/pull.d.ts +13 -0
- package/dist/oclif/commands/vc/pull.js +60 -0
- package/dist/oclif/commands/vc/push.d.ts +13 -0
- package/dist/oclif/commands/vc/push.js +60 -0
- package/dist/oclif/commands/vc/remote/add.d.ts +10 -0
- package/dist/oclif/commands/vc/remote/add.js +30 -0
- package/dist/oclif/commands/vc/remote/index.d.ts +6 -0
- package/dist/oclif/commands/vc/remote/index.js +16 -0
- package/dist/oclif/commands/vc/remote/set-url.d.ts +10 -0
- package/dist/oclif/commands/vc/remote/set-url.js +30 -0
- package/dist/oclif/commands/vc/reset.d.ts +13 -0
- package/dist/oclif/commands/vc/reset.js +62 -0
- package/dist/oclif/commands/vc/status.d.ts +8 -0
- package/dist/oclif/commands/vc/status.js +106 -0
- package/dist/oclif/hooks/init/validate-brv-config.d.ts +26 -0
- package/dist/oclif/hooks/init/validate-brv-config.js +62 -0
- package/dist/oclif/lib/daemon-client.d.ts +2 -0
- package/dist/oclif/lib/daemon-client.js +36 -10
- package/dist/oclif/lib/prompt-utils.d.ts +43 -0
- package/dist/oclif/lib/prompt-utils.js +84 -0
- package/dist/oclif/lib/spinner.d.ts +8 -0
- package/dist/oclif/lib/spinner.js +23 -0
- package/dist/oclif/lib/task-client.d.ts +5 -0
- package/dist/oclif/lib/task-client.js +15 -2
- package/dist/server/config/environment.d.ts +2 -0
- package/dist/server/config/environment.js +2 -0
- package/dist/server/constants.d.ts +3 -0
- package/dist/server/constants.js +9 -0
- package/dist/server/core/domain/entities/auth-token.d.ts +2 -0
- package/dist/server/core/domain/entities/auth-token.js +7 -1
- package/dist/server/core/domain/entities/curate-log-entry.d.ts +11 -0
- package/dist/server/core/domain/entities/space.d.ts +4 -0
- package/dist/server/core/domain/entities/space.js +8 -0
- package/dist/server/core/domain/entities/team.d.ts +2 -0
- package/dist/server/core/domain/entities/team.js +4 -0
- package/dist/server/core/domain/errors/git-error.d.ts +6 -0
- package/dist/server/core/domain/errors/git-error.js +12 -0
- package/dist/server/core/domain/errors/task-error.d.ts +4 -0
- package/dist/server/core/domain/errors/task-error.js +8 -0
- package/dist/server/core/domain/errors/vc-error.d.ts +5 -0
- package/dist/server/core/domain/errors/vc-error.js +8 -0
- package/dist/server/core/domain/knowledge/markdown-writer.d.ts +4 -1
- package/dist/server/core/domain/knowledge/markdown-writer.js +37 -7
- package/dist/server/core/domain/transport/schemas.d.ts +6 -6
- package/dist/server/core/interfaces/context-tree/i-context-tree-service.d.ts +11 -0
- package/dist/server/core/interfaces/process/i-task-lifecycle-hook.d.ts +6 -0
- package/dist/server/core/interfaces/services/i-git-service.d.ts +234 -0
- package/dist/server/core/interfaces/services/i-git-service.js +1 -0
- package/dist/server/core/interfaces/storage/i-curate-log-store.d.ts +5 -0
- package/dist/server/core/interfaces/storage/i-review-backup-store.d.ts +19 -0
- package/dist/server/core/interfaces/storage/i-review-backup-store.js +1 -0
- package/dist/server/core/interfaces/vc/i-vc-git-config-store.d.ts +8 -0
- package/dist/server/core/interfaces/vc/i-vc-git-config-store.js +1 -0
- package/dist/server/infra/config/auto-init.d.ts +0 -2
- package/dist/server/infra/config/auto-init.js +0 -1
- package/dist/server/infra/context-tree/file-context-tree-service.d.ts +2 -0
- package/dist/server/infra/context-tree/file-context-tree-service.js +13 -0
- package/dist/server/infra/daemon/brv-server.js +23 -3
- package/dist/server/infra/git/cogit-url.d.ts +17 -0
- package/dist/server/infra/git/cogit-url.js +39 -0
- package/dist/server/infra/git/git-http-wrapper.d.ts +20 -0
- package/dist/server/infra/git/git-http-wrapper.js +334 -0
- package/dist/server/infra/git/isomorphic-git-service.d.ts +78 -0
- package/dist/server/infra/git/isomorphic-git-service.js +983 -0
- package/dist/server/infra/http/review-api-handler.d.ts +13 -0
- package/dist/server/infra/http/review-api-handler.js +286 -0
- package/dist/server/infra/http/review-ui.d.ts +7 -0
- package/dist/server/infra/http/review-ui.js +606 -0
- package/dist/server/infra/mcp/tools/brv-curate-tool.d.ts +2 -2
- package/dist/server/infra/process/curate-log-handler.d.ts +18 -2
- package/dist/server/infra/process/curate-log-handler.js +50 -13
- package/dist/server/infra/process/feature-handlers.js +41 -1
- package/dist/server/infra/process/task-router.js +16 -0
- package/dist/server/infra/space/http-space-service.js +2 -0
- package/dist/server/infra/storage/file-curate-log-store.d.ts +10 -0
- package/dist/server/infra/storage/file-curate-log-store.js +35 -0
- package/dist/server/infra/storage/file-review-backup-store.d.ts +29 -0
- package/dist/server/infra/storage/file-review-backup-store.js +121 -0
- package/dist/server/infra/transport/handlers/auth-handler.js +9 -5
- package/dist/server/infra/transport/handlers/handler-types.d.ts +9 -0
- package/dist/server/infra/transport/handlers/handler-types.js +11 -0
- package/dist/server/infra/transport/handlers/index.d.ts +4 -0
- package/dist/server/infra/transport/handlers/index.js +2 -0
- package/dist/server/infra/transport/handlers/init-handler.d.ts +1 -0
- package/dist/server/infra/transport/handlers/init-handler.js +13 -1
- package/dist/server/infra/transport/handlers/pull-handler.d.ts +3 -0
- package/dist/server/infra/transport/handlers/pull-handler.js +5 -1
- package/dist/server/infra/transport/handlers/push-handler.d.ts +20 -0
- package/dist/server/infra/transport/handlers/push-handler.js +116 -14
- package/dist/server/infra/transport/handlers/reset-handler.d.ts +11 -0
- package/dist/server/infra/transport/handlers/reset-handler.js +37 -1
- package/dist/server/infra/transport/handlers/review-handler.d.ts +35 -0
- package/dist/server/infra/transport/handlers/review-handler.js +162 -0
- package/dist/server/infra/transport/handlers/space-handler.d.ts +3 -0
- package/dist/server/infra/transport/handlers/space-handler.js +4 -1
- package/dist/server/infra/transport/handlers/status-handler.d.ts +5 -0
- package/dist/server/infra/transport/handlers/status-handler.js +51 -16
- package/dist/server/infra/transport/handlers/vc-handler.d.ts +100 -0
- package/dist/server/infra/transport/handlers/vc-handler.js +1050 -0
- package/dist/server/infra/transport/socket-io-transport-server.d.ts +7 -0
- package/dist/server/infra/transport/socket-io-transport-server.js +12 -1
- package/dist/server/infra/transport/transport-connector.d.ts +1 -1
- package/dist/server/infra/transport/transport-connector.js +2 -1
- package/dist/server/infra/vc/file-vc-git-config-store.d.ts +11 -0
- package/dist/server/infra/vc/file-vc-git-config-store.js +43 -0
- package/dist/server/templates/skill/SKILL.md +167 -33
- package/dist/server/utils/curate-result-parser.d.ts +64 -0
- package/dist/server/utils/curate-result-parser.js +8 -0
- package/dist/server/utils/gitignore.d.ts +9 -0
- package/dist/server/utils/gitignore.js +47 -0
- package/dist/shared/transport/events/index.d.ts +6 -0
- package/dist/shared/transport/events/index.js +3 -0
- package/dist/shared/transport/events/init-events.d.ts +8 -0
- package/dist/shared/transport/events/init-events.js +1 -0
- package/dist/shared/transport/events/push-events.d.ts +6 -0
- package/dist/shared/transport/events/review-events.d.ts +41 -0
- package/dist/shared/transport/events/review-events.js +5 -0
- package/dist/shared/transport/events/vc-events.d.ts +257 -0
- package/dist/shared/transport/events/vc-events.js +67 -0
- package/dist/shared/transport/types/dto.d.ts +6 -1
- package/dist/tui/app/pages/init-project-page.d.ts +9 -0
- package/dist/tui/app/pages/init-project-page.js +54 -0
- package/dist/tui/app/pages/protected-routes.js +14 -6
- package/dist/tui/components/index.d.ts +0 -2
- package/dist/tui/components/index.js +0 -1
- package/dist/tui/features/activity/hooks/use-activity-logs.js +7 -1
- package/dist/tui/features/commands/definitions/index.js +3 -0
- package/dist/tui/features/commands/definitions/space-list.js +9 -18
- package/dist/tui/features/commands/definitions/space-switch.js +10 -6
- package/dist/tui/features/commands/definitions/vc-add.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-add.js +15 -0
- package/dist/tui/features/commands/definitions/vc-branch.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-branch.js +33 -0
- package/dist/tui/features/commands/definitions/vc-checkout.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-checkout.js +32 -0
- package/dist/tui/features/commands/definitions/vc-clone.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-clone.js +18 -0
- package/dist/tui/features/commands/definitions/vc-commit.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-commit.js +32 -0
- package/dist/tui/features/commands/definitions/vc-config.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-config.js +40 -0
- package/dist/tui/features/commands/definitions/vc-fetch.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-fetch.js +37 -0
- package/dist/tui/features/commands/definitions/vc-init.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-init.js +11 -0
- package/dist/tui/features/commands/definitions/vc-log.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-log.js +25 -0
- package/dist/tui/features/commands/definitions/vc-merge.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-merge.js +48 -0
- package/dist/tui/features/commands/definitions/vc-pull.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-pull.js +42 -0
- package/dist/tui/features/commands/definitions/vc-push.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-push.js +38 -0
- package/dist/tui/features/commands/definitions/vc-remote.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-remote.js +57 -0
- package/dist/tui/features/commands/definitions/vc-reset.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-reset.js +35 -0
- package/dist/tui/features/commands/definitions/vc-status.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc-status.js +11 -0
- package/dist/tui/features/commands/definitions/vc.d.ts +2 -0
- package/dist/tui/features/commands/definitions/vc.js +36 -0
- package/dist/tui/features/commands/hooks/use-slash-command-processor.js +5 -5
- package/dist/tui/features/log/api/execute-log.d.ts +8 -0
- package/dist/tui/features/log/api/execute-log.js +13 -0
- package/dist/tui/features/log/components/log-flow.d.ts +14 -0
- package/dist/tui/features/log/components/log-flow.js +29 -0
- package/dist/tui/features/log/utils/format-log.d.ts +3 -0
- package/dist/tui/features/log/utils/format-log.js +42 -0
- package/dist/tui/features/onboarding/hooks/use-app-view-mode.d.ts +9 -5
- package/dist/tui/features/onboarding/hooks/use-app-view-mode.js +12 -5
- package/dist/tui/features/push/components/push-flow.js +9 -2
- package/dist/tui/features/reset/components/reset-flow.js +2 -1
- package/dist/tui/features/status/components/status-view.js +2 -1
- package/dist/tui/features/status/utils/format-status.js +9 -0
- package/dist/tui/features/tasks/hooks/use-task-subscriptions.js +11 -0
- package/dist/tui/features/tasks/stores/tasks-store.d.ts +10 -0
- package/dist/tui/features/tasks/stores/tasks-store.js +16 -0
- package/dist/tui/features/vc/add/api/execute-vc-add.d.ts +8 -0
- package/dist/tui/features/vc/add/api/execute-vc-add.js +13 -0
- package/dist/tui/features/vc/add/components/vc-add-flow.d.ts +7 -0
- package/dist/tui/features/vc/add/components/vc-add-flow.js +35 -0
- package/dist/tui/features/vc/branch/api/execute-vc-branch.d.ts +8 -0
- package/dist/tui/features/vc/branch/api/execute-vc-branch.js +13 -0
- package/dist/tui/features/vc/branch/components/vc-branch-flow.d.ts +8 -0
- package/dist/tui/features/vc/branch/components/vc-branch-flow.js +53 -0
- package/dist/tui/features/vc/branch/utils/format-branch.d.ts +4 -0
- package/dist/tui/features/vc/branch/utils/format-branch.js +12 -0
- package/dist/tui/features/vc/checkout/api/execute-vc-checkout.d.ts +8 -0
- package/dist/tui/features/vc/checkout/api/execute-vc-checkout.js +13 -0
- package/dist/tui/features/vc/checkout/components/vc-checkout-flow.d.ts +8 -0
- package/dist/tui/features/vc/checkout/components/vc-checkout-flow.js +33 -0
- package/dist/tui/features/vc/clone/api/execute-vc-clone.d.ts +8 -0
- package/dist/tui/features/vc/clone/api/execute-vc-clone.js +13 -0
- package/dist/tui/features/vc/clone/components/vc-clone-flow.d.ts +7 -0
- package/dist/tui/features/vc/clone/components/vc-clone-flow.js +79 -0
- package/dist/tui/features/vc/commit/api/execute-vc-commit.d.ts +8 -0
- package/dist/tui/features/vc/commit/api/execute-vc-commit.js +13 -0
- package/dist/tui/features/vc/commit/components/vc-commit-flow.d.ts +7 -0
- package/dist/tui/features/vc/commit/components/vc-commit-flow.js +29 -0
- package/dist/tui/features/vc/config/api/execute-vc-config.d.ts +8 -0
- package/dist/tui/features/vc/config/api/execute-vc-config.js +13 -0
- package/dist/tui/features/vc/config/components/vc-config-flow.d.ts +9 -0
- package/dist/tui/features/vc/config/components/vc-config-flow.js +30 -0
- package/dist/tui/features/vc/fetch/api/execute-vc-fetch.d.ts +8 -0
- package/dist/tui/features/vc/fetch/api/execute-vc-fetch.js +13 -0
- package/dist/tui/features/vc/fetch/components/vc-fetch-flow.d.ts +8 -0
- package/dist/tui/features/vc/fetch/components/vc-fetch-flow.js +75 -0
- package/dist/tui/features/vc/init/api/execute-vc-init.d.ts +8 -0
- package/dist/tui/features/vc/init/api/execute-vc-init.js +13 -0
- package/dist/tui/features/vc/init/components/vc-init-flow.d.ts +10 -0
- package/dist/tui/features/vc/init/components/vc-init-flow.js +37 -0
- package/dist/tui/features/vc/merge/api/execute-vc-merge.d.ts +8 -0
- package/dist/tui/features/vc/merge/api/execute-vc-merge.js +13 -0
- package/dist/tui/features/vc/merge/components/vc-merge-flow.d.ts +11 -0
- package/dist/tui/features/vc/merge/components/vc-merge-flow.js +72 -0
- package/dist/tui/features/vc/pull/api/execute-vc-pull.d.ts +8 -0
- package/dist/tui/features/vc/pull/api/execute-vc-pull.js +13 -0
- package/dist/tui/features/vc/pull/components/vc-pull-flow.d.ts +9 -0
- package/dist/tui/features/vc/pull/components/vc-pull-flow.js +83 -0
- package/dist/tui/features/vc/push/api/execute-vc-push.d.ts +8 -0
- package/dist/tui/features/vc/push/api/execute-vc-push.js +13 -0
- package/dist/tui/features/vc/push/components/vc-push-flow.d.ts +8 -0
- package/dist/tui/features/vc/push/components/vc-push-flow.js +83 -0
- package/dist/tui/features/vc/remote/api/execute-vc-remote.d.ts +8 -0
- package/dist/tui/features/vc/remote/api/execute-vc-remote.js +13 -0
- package/dist/tui/features/vc/remote/components/vc-remote-flow.d.ts +9 -0
- package/dist/tui/features/vc/remote/components/vc-remote-flow.js +42 -0
- package/dist/tui/features/vc/reset/api/execute-vc-reset.d.ts +8 -0
- package/dist/tui/features/vc/reset/api/execute-vc-reset.js +13 -0
- package/dist/tui/features/vc/reset/components/vc-reset-flow.d.ts +10 -0
- package/dist/tui/features/vc/reset/components/vc-reset-flow.js +63 -0
- package/dist/tui/features/vc/status/api/execute-vc-status.d.ts +8 -0
- package/dist/tui/features/vc/status/api/execute-vc-status.js +13 -0
- package/dist/tui/features/vc/status/components/vc-status-flow.d.ts +10 -0
- package/dist/tui/features/vc/status/components/vc-status-flow.js +133 -0
- package/dist/tui/lib/environment.d.ts +8 -0
- package/dist/tui/lib/environment.js +8 -0
- package/dist/tui/utils/error-messages.d.ts +5 -1
- package/dist/tui/utils/error-messages.js +32 -3
- package/oclif.manifest.json +1018 -98
- package/package.json +9 -3
- package/dist/oclif/hooks/prerun/validate-brv-config-version.d.ts +0 -33
- package/dist/oclif/hooks/prerun/validate-brv-config-version.js +0 -86
- package/dist/tui/components/init.d.ts +0 -33
- package/dist/tui/components/init.js +0 -234
- package/dist/tui/features/space/api/get-spaces.d.ts +0 -16
- package/dist/tui/features/space/api/get-spaces.js +0 -17
- package/dist/tui/features/space/api/switch-space.d.ts +0 -11
- package/dist/tui/features/space/api/switch-space.js +0 -24
- package/dist/tui/features/space/components/space-list-view.d.ts +0 -12
- package/dist/tui/features/space/components/space-list-view.js +0 -56
- package/dist/tui/features/space/components/space-switch-flow.d.ts +0 -13
- package/dist/tui/features/space/components/space-switch-flow.js +0 -97
|
@@ -112,6 +112,7 @@ prompt: |
|
|
|
112
112
|
path: 'design/alert_engine',
|
|
113
113
|
title: 'Alert Engine',
|
|
114
114
|
reason: 'Document alert engine architecture',
|
|
115
|
+
summary: 'Alert Engine consuming events with dedup and SLA-based routing',
|
|
115
116
|
content: {
|
|
116
117
|
rawConcept: { task: 'Document Alert Engine', flow: 'Events -> Router -> Routing' },
|
|
117
118
|
narrative: { structure: 'Consumes events and routes alerts.', highlights: 'Deduplication, SLAs' }
|
|
@@ -318,7 +319,8 @@ prompt: |
|
|
|
318
319
|
const result = await tools.curate([{
|
|
319
320
|
type: 'UPSERT', path: '<domain>/<topic>', title: '<title>',
|
|
320
321
|
content: { rawConcept: { task: '...', /* ... */ }, narrative: { /* ... */ } },
|
|
321
|
-
reason: 'Curate from RLM context'
|
|
322
|
+
reason: 'Curate from RLM context',
|
|
323
|
+
summary: 'One-line semantic summary of what this knowledge file contains'
|
|
322
324
|
}]);
|
|
323
325
|
// Verify inline — CurateResult.applied[].filePath already has paths
|
|
324
326
|
const created = result.applied.filter(r => r.status === 'success').map(r => r.filePath);
|
|
@@ -379,12 +381,14 @@ prompt: |
|
|
|
379
381
|
|
|
380
382
|
| Operation | When to Use | Required Fields |
|
|
381
383
|
|-----------|-------------|-----------------|
|
|
382
|
-
| **UPSERT** | **PREFERRED** - Creates or updates automatically | path, title, content, reason |
|
|
383
|
-
| **ADD** | Only when you're certain file doesn't exist | path, title, content, reason |
|
|
384
|
-
| **UPDATE** | Only when you're certain file exists | path, title, content, reason |
|
|
385
|
-
| **MERGE** | Combining TWO EXISTING files | path, title, mergeTarget, mergeTargetTitle, reason |
|
|
384
|
+
| **UPSERT** | **PREFERRED** - Creates or updates automatically | path, title, content, reason, summary |
|
|
385
|
+
| **ADD** | Only when you're certain file doesn't exist | path, title, content, reason, summary |
|
|
386
|
+
| **UPDATE** | Only when you're certain file exists | path, title, content, reason, summary |
|
|
387
|
+
| **MERGE** | Combining TWO EXISTING files | path, title, mergeTarget, mergeTargetTitle, reason, summary |
|
|
386
388
|
| **DELETE** | Removing file or folder | path, reason (title optional) |
|
|
387
389
|
|
|
390
|
+
**summary** — One-line semantic summary of what the knowledge file contains after this operation. Required for ADD/UPDATE/UPSERT/MERGE. Helps reviewers quickly grasp the content without reading the full document.
|
|
391
|
+
|
|
388
392
|
**UPSERT is the recommended default:**
|
|
389
393
|
- Automatically checks if file exists
|
|
390
394
|
- Creates new file (ADD) if missing
|
|
@@ -427,6 +431,8 @@ prompt: |
|
|
|
427
431
|
type: 'UPSERT', // Auto-detects ADD vs UPDATE
|
|
428
432
|
path: 'authentication/jwt',
|
|
429
433
|
title: 'Token Handling',
|
|
434
|
+
reason: 'Documenting JWT authentication',
|
|
435
|
+
summary: 'JWT authentication with 15-min access tokens and refresh token rotation',
|
|
430
436
|
content: {
|
|
431
437
|
rawConcept: {
|
|
432
438
|
task: 'Implement JWT authentication',
|
|
@@ -440,7 +446,6 @@ prompt: |
|
|
|
440
446
|
},
|
|
441
447
|
domainContext: { /* only for new domains */ },
|
|
442
448
|
topicContext: { /* only for new topics */ },
|
|
443
|
-
reason: 'Documenting JWT authentication'
|
|
444
449
|
}
|
|
445
450
|
]);
|
|
446
451
|
|
|
@@ -523,6 +528,8 @@ prompt: |
|
|
|
523
528
|
type: 'UPSERT', // Preferred - auto-detects ADD vs UPDATE
|
|
524
529
|
path: 'structure/authentication',
|
|
525
530
|
title: 'JWT Token Handling',
|
|
531
|
+
reason: 'Documenting new JWT authentication system',
|
|
532
|
+
summary: 'JWT auth with 15-min access tokens, 7-day refresh tokens, Redis blacklist, and token rotation',
|
|
526
533
|
content: {
|
|
527
534
|
rawConcept: {
|
|
528
535
|
task: 'Implement JWT-based authentication with refresh tokens',
|
|
@@ -552,7 +559,6 @@ prompt: |
|
|
|
552
559
|
},
|
|
553
560
|
relations: ['@structure/redis/overview.md', '@design/security/token-validation.md']
|
|
554
561
|
},
|
|
555
|
-
reason: 'Documenting new JWT authentication system'
|
|
556
562
|
}
|
|
557
563
|
]);
|
|
558
564
|
```
|
|
@@ -564,6 +570,8 @@ prompt: |
|
|
|
564
570
|
type: 'UPSERT',
|
|
565
571
|
path: 'project_management/retrospectives',
|
|
566
572
|
title: 'Sprint 13 Retro',
|
|
573
|
+
reason: 'Documenting Sprint 13 retrospective findings and action items',
|
|
574
|
+
summary: 'Sprint 13 retro: 34/35 points delivered, adopted mob programming and day-3 change cutoff',
|
|
567
575
|
content: {
|
|
568
576
|
rawConcept: {
|
|
569
577
|
task: 'Sprint 13 Retrospective - Jan 22 to Feb 5, 2026',
|
|
@@ -585,7 +593,6 @@ prompt: |
|
|
|
585
593
|
},
|
|
586
594
|
relations: ['@project_management/sprints/sprint_14_review.md']
|
|
587
595
|
},
|
|
588
|
-
reason: 'Documenting Sprint 13 retrospective findings and action items'
|
|
589
596
|
}
|
|
590
597
|
]);
|
|
591
598
|
```
|
|
@@ -88,6 +88,9 @@ When calling `tools.*` methods, you **MUST** wrap code in an async IIFE:
|
|
|
88
88
|
path: 'design/alert_engine',
|
|
89
89
|
title: 'Alert Engine',
|
|
90
90
|
reason: 'Document alert engine architecture',
|
|
91
|
+
summary: 'Alert Engine consuming events with dedup, escalation, and SLA-based routing to PagerDuty/Slack/Email',
|
|
92
|
+
confidence: 'high',
|
|
93
|
+
impact: 'low',
|
|
91
94
|
content: {
|
|
92
95
|
rawConcept: {
|
|
93
96
|
task: 'Document the Alert Engine component',
|
|
@@ -21,9 +21,15 @@ Curate knowledge topics with atomic operations. This tool manages the knowledge
|
|
|
21
21
|
- **snippets**: Code/text snippets (legacy support, optional)
|
|
22
22
|
- **relations**: Related topics using @domain/topic notation
|
|
23
23
|
|
|
24
|
+
**Per-Operation Metadata (required for all operations):**
|
|
25
|
+
- **reason**: WHY this knowledge is being curated — the motivation for a human reviewer
|
|
26
|
+
- **summary**: One-line semantic summary of what the knowledge file contains after this operation. Written for a human reviewer to quickly grasp the content. Example: "Caching strategy using Redis with 5-min TTL and write-through invalidation". Required for ADD/UPDATE/UPSERT/MERGE, not needed for DELETE.
|
|
27
|
+
- **confidence**: "high" or "low" — your confidence in accuracy/completeness
|
|
28
|
+
- **impact**: "high" or "low" — scope of change (see tool schema for details)
|
|
29
|
+
|
|
24
30
|
**Operations:**
|
|
25
31
|
1. **ADD** - Create new titled context file in domain/topic/subtopic
|
|
26
|
-
- Requires: path, title, content, reason
|
|
32
|
+
- Requires: path, title, content, reason, summary
|
|
27
33
|
- Example with Raw Concept + Narrative:
|
|
28
34
|
{
|
|
29
35
|
type: "ADD",
|
|
@@ -46,12 +52,15 @@ Curate knowledge topics with atomic operations. This tool manages the knowledge
|
|
|
46
52
|
},
|
|
47
53
|
relations: ["@structure/database"]
|
|
48
54
|
},
|
|
49
|
-
reason: "New caching pattern"
|
|
55
|
+
reason: "New caching pattern",
|
|
56
|
+
summary: "Redis caching layer for getUserPermissions with 300s TTL and singleton client pattern",
|
|
57
|
+
confidence: "high",
|
|
58
|
+
impact: "low"
|
|
50
59
|
}
|
|
51
60
|
- Creates: structure/caching/redis_user_permissions.md
|
|
52
61
|
|
|
53
62
|
2. **UPDATE** - Modify existing titled context file (full replacement)
|
|
54
|
-
- Requires: path, title, content, reason
|
|
63
|
+
- Requires: path, title, content, reason, summary
|
|
55
64
|
- Supports same content structure as ADD
|
|
56
65
|
|
|
57
66
|
3. **MERGE** - Combine source file into target file, delete source
|
|
@@ -3,7 +3,7 @@ import { type ConnectorInstallResponse } from '../../../shared/transport/events/
|
|
|
3
3
|
import { type DaemonClientOptions } from '../../lib/daemon-client.js';
|
|
4
4
|
export default class ConnectorsInstall extends Command {
|
|
5
5
|
static args: {
|
|
6
|
-
agent: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
agent: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
8
|
static description: string;
|
|
9
9
|
static examples: string[];
|
|
@@ -27,5 +27,6 @@ export default class ConnectorsInstall extends Command {
|
|
|
27
27
|
fromType: "rules" | "hook" | "mcp" | "skill" | undefined;
|
|
28
28
|
result: ConnectorInstallResponse;
|
|
29
29
|
}>;
|
|
30
|
+
protected promptForAgent(options?: DaemonClientOptions): Promise<string>;
|
|
30
31
|
run(): Promise<void>;
|
|
31
32
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
1
2
|
import { Args, Command, Flags } from '@oclif/core';
|
|
2
3
|
import { AGENT_CONNECTOR_CONFIG } from '../../../server/core/domain/entities/agent.js';
|
|
3
4
|
import { ConnectorEvents, } from '../../../shared/transport/events/connector-events.js';
|
|
@@ -6,6 +7,7 @@ import { isConnectorType, requiresAgentRestart } from '../../../shared/types/con
|
|
|
6
7
|
import { getConnectorName } from '../../../tui/features/connectors/utils/get-connector-name.js';
|
|
7
8
|
import { withDaemonRetry } from '../../lib/daemon-client.js';
|
|
8
9
|
import { writeJsonResponse } from '../../lib/json-response.js';
|
|
10
|
+
import { isPromptCancelled } from '../../lib/prompt-utils.js';
|
|
9
11
|
const agentTable = AGENT_VALUES.map((agent) => {
|
|
10
12
|
const config = AGENT_CONNECTOR_CONFIG[agent];
|
|
11
13
|
const supported = config.supported.map((type) => getConnectorName(type)).join(', ');
|
|
@@ -14,8 +16,8 @@ const agentTable = AGENT_VALUES.map((agent) => {
|
|
|
14
16
|
export default class ConnectorsInstall extends Command {
|
|
15
17
|
static args = {
|
|
16
18
|
agent: Args.string({
|
|
17
|
-
description: 'Agent name to install connector for (e.g., "Claude Code", "Cursor")',
|
|
18
|
-
required:
|
|
19
|
+
description: 'Agent name to install connector for (e.g., "Claude Code", "Cursor"). Omit for interactive selection.',
|
|
20
|
+
required: false,
|
|
19
21
|
}),
|
|
20
22
|
};
|
|
21
23
|
static description = `Install or switch a connector for an agent
|
|
@@ -81,12 +83,45 @@ ${agentTable}`;
|
|
|
81
83
|
};
|
|
82
84
|
}, options);
|
|
83
85
|
}
|
|
86
|
+
async promptForAgent(options) {
|
|
87
|
+
const { agents } = await withDaemonRetry(async (client) => client.requestWithAck(ConnectorEvents.GET_AGENTS), options);
|
|
88
|
+
// Add a blank line before the prompt
|
|
89
|
+
this.log('');
|
|
90
|
+
return select({
|
|
91
|
+
choices: agents.map((a) => ({
|
|
92
|
+
description: `Connector type: ${getConnectorName(a.defaultConnectorType)}`,
|
|
93
|
+
name: a.name,
|
|
94
|
+
value: a.id,
|
|
95
|
+
})),
|
|
96
|
+
loop: false,
|
|
97
|
+
message: 'Select your coding agent to install the connector (type to search):',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
84
100
|
async run() {
|
|
85
101
|
const { args, flags } = await this.parse(ConnectorsInstall);
|
|
102
|
+
let agentId = args.agent;
|
|
86
103
|
const format = flags.format;
|
|
104
|
+
if (!agentId) {
|
|
105
|
+
if (format === 'json') {
|
|
106
|
+
writeJsonResponse({
|
|
107
|
+
command: 'connectors install',
|
|
108
|
+
data: { error: 'Agent argument is required for JSON output' },
|
|
109
|
+
success: false,
|
|
110
|
+
});
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
agentId = await this.promptForAgent();
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (!isPromptCancelled(error))
|
|
118
|
+
throw error;
|
|
119
|
+
return; // user cancelled agent selection
|
|
120
|
+
}
|
|
121
|
+
}
|
|
87
122
|
try {
|
|
88
123
|
const installResult = await this.installConnector({
|
|
89
|
-
agentId
|
|
124
|
+
agentId,
|
|
90
125
|
connectorType: flags.type,
|
|
91
126
|
});
|
|
92
127
|
if (format === 'json') {
|
|
@@ -14,11 +14,29 @@ export default class Curate extends Command {
|
|
|
14
14
|
};
|
|
15
15
|
protected getDaemonClientOptions(): DaemonClientOptions;
|
|
16
16
|
run(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Build the pendingReview JSON payload for --format json output.
|
|
19
|
+
* Uses server-authoritative count; files list is best-effort enrichment from tool results.
|
|
20
|
+
*/
|
|
21
|
+
private buildPendingReviewJson;
|
|
22
|
+
/**
|
|
23
|
+
* Collect all operations requiring review from the completed tool calls.
|
|
24
|
+
* Best-effort enrichment: returns per-file detail when tool results include needsReview.
|
|
25
|
+
* The authoritative signal for whether review is required comes from ReviewEvents.NOTIFY.
|
|
26
|
+
*/
|
|
27
|
+
private collectPendingReviewOps;
|
|
17
28
|
/**
|
|
18
29
|
* Extract file changes from collected tool calls (same logic as TUI useActivityLogs).
|
|
19
30
|
*/
|
|
20
31
|
private composeChangesFromToolCalls;
|
|
21
32
|
private extractChangesFromApplied;
|
|
33
|
+
private extractContextTreeRelativePath;
|
|
34
|
+
/**
|
|
35
|
+
* Print a human-readable pending review summary to stdout.
|
|
36
|
+
* Called after successful curate completion when review is required.
|
|
37
|
+
* pendingCount is server-authoritative; pendingOps provides best-effort per-file detail.
|
|
38
|
+
*/
|
|
39
|
+
private printPendingReviewSummary;
|
|
22
40
|
private reportError;
|
|
23
41
|
private submitTask;
|
|
24
42
|
private validateInput;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Args, Command, Flags } from '@oclif/core';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { BRV_DIR, CONTEXT_TREE_DIR } from '../../../server/constants.js';
|
|
3
4
|
import { TransportStateEventNames } from '../../../server/core/domain/transport/index.js';
|
|
4
5
|
import { extractCurateOperations } from '../../../server/utils/curate-result-parser.js';
|
|
5
6
|
import { TaskEvents } from '../../../shared/transport/events/index.js';
|
|
@@ -105,6 +106,43 @@ Bad examples:
|
|
|
105
106
|
this.reportError(error, format, providerContext);
|
|
106
107
|
}
|
|
107
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Build the pendingReview JSON payload for --format json output.
|
|
111
|
+
* Uses server-authoritative count; files list is best-effort enrichment from tool results.
|
|
112
|
+
*/
|
|
113
|
+
buildPendingReviewJson(pendingCount, pendingOps, taskId) {
|
|
114
|
+
return {
|
|
115
|
+
count: pendingCount,
|
|
116
|
+
files: pendingOps.map((op) => ({
|
|
117
|
+
after: op.summary,
|
|
118
|
+
before: op.previousSummary,
|
|
119
|
+
filePath: this.extractContextTreeRelativePath(op.filePath) ?? op.path,
|
|
120
|
+
impact: op.impact,
|
|
121
|
+
path: op.path,
|
|
122
|
+
reason: op.reason,
|
|
123
|
+
type: op.type,
|
|
124
|
+
})),
|
|
125
|
+
taskId,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Collect all operations requiring review from the completed tool calls.
|
|
130
|
+
* Best-effort enrichment: returns per-file detail when tool results include needsReview.
|
|
131
|
+
* The authoritative signal for whether review is required comes from ReviewEvents.NOTIFY.
|
|
132
|
+
*/
|
|
133
|
+
collectPendingReviewOps(toolCalls) {
|
|
134
|
+
const pending = [];
|
|
135
|
+
for (const tc of toolCalls) {
|
|
136
|
+
if (tc.status !== 'completed')
|
|
137
|
+
continue;
|
|
138
|
+
const ops = extractCurateOperations({ result: tc.result, toolName: tc.toolName });
|
|
139
|
+
for (const op of ops) {
|
|
140
|
+
if (op.needsReview === true)
|
|
141
|
+
pending.push(op);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return pending;
|
|
145
|
+
}
|
|
108
146
|
/**
|
|
109
147
|
* Extract file changes from collected tool calls (same logic as TUI useActivityLogs).
|
|
110
148
|
*/
|
|
@@ -138,6 +176,37 @@ Bad examples:
|
|
|
138
176
|
}
|
|
139
177
|
}
|
|
140
178
|
}
|
|
179
|
+
extractContextTreeRelativePath(filePath) {
|
|
180
|
+
if (!filePath)
|
|
181
|
+
return undefined;
|
|
182
|
+
const marker = `${BRV_DIR}/${CONTEXT_TREE_DIR}/`;
|
|
183
|
+
const idx = filePath.indexOf(marker);
|
|
184
|
+
if (idx === -1)
|
|
185
|
+
return undefined;
|
|
186
|
+
return filePath.slice(idx + marker.length);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Print a human-readable pending review summary to stdout.
|
|
190
|
+
* Called after successful curate completion when review is required.
|
|
191
|
+
* pendingCount is server-authoritative; pendingOps provides best-effort per-file detail.
|
|
192
|
+
*/
|
|
193
|
+
printPendingReviewSummary(pendingCount, pendingOps, taskId) {
|
|
194
|
+
this.log(`\n⚠ ${pendingCount} operation${pendingCount === 1 ? '' : 's'} require${pendingCount === 1 ? 's' : ''} review (task: ${taskId})`);
|
|
195
|
+
for (const op of pendingOps) {
|
|
196
|
+
const impact = op.impact === 'high' ? ' · HIGH IMPACT' : '';
|
|
197
|
+
const displayPath = this.extractContextTreeRelativePath(op.filePath) ?? op.path;
|
|
198
|
+
this.log(`\n [${op.type}${impact}] - path: ${displayPath}`);
|
|
199
|
+
if (op.reason)
|
|
200
|
+
this.log(` Why: ${op.reason}`);
|
|
201
|
+
if (op.previousSummary)
|
|
202
|
+
this.log(` Before: ${op.previousSummary.replaceAll('\n', '\n ')}`);
|
|
203
|
+
if (op.summary)
|
|
204
|
+
this.log(` After: ${op.summary.replaceAll('\n', '\n ')}`);
|
|
205
|
+
}
|
|
206
|
+
this.log(`\n To approve all: brv review approve ${taskId}`);
|
|
207
|
+
this.log(` To reject all: brv review reject ${taskId}`);
|
|
208
|
+
this.log(` Per file: brv review approve/reject ${taskId} --file <path> [--file <path>]`);
|
|
209
|
+
}
|
|
141
210
|
reportError(error, format, providerContext) {
|
|
142
211
|
const errorMessage = error instanceof Error ? error.message : 'Curate failed';
|
|
143
212
|
if (format === 'json') {
|
|
@@ -184,8 +253,10 @@ Bad examples:
|
|
|
184
253
|
client,
|
|
185
254
|
command: 'curate',
|
|
186
255
|
format,
|
|
187
|
-
onCompleted: ({ logId, taskId: tid, toolCalls }) => {
|
|
256
|
+
onCompleted: ({ logId, pendingReview, taskId: tid, toolCalls }) => {
|
|
188
257
|
const changes = this.composeChangesFromToolCalls(toolCalls);
|
|
258
|
+
// Per-file detail is best-effort enrichment; server notify is authoritative
|
|
259
|
+
const pendingOps = pendingReview ? this.collectPendingReviewOps(toolCalls) : [];
|
|
189
260
|
if (format === 'text') {
|
|
190
261
|
for (const file of changes.created) {
|
|
191
262
|
this.log(` add ${file}`);
|
|
@@ -195,6 +266,9 @@ Bad examples:
|
|
|
195
266
|
}
|
|
196
267
|
const logSuffix = logId ? ` (Log: ${logId})` : '';
|
|
197
268
|
this.log(`✓ Context curated successfully.${logSuffix}`);
|
|
269
|
+
if (pendingReview) {
|
|
270
|
+
this.printPendingReviewSummary(pendingReview.pendingCount, pendingOps, tid);
|
|
271
|
+
}
|
|
198
272
|
}
|
|
199
273
|
else {
|
|
200
274
|
writeJsonResponse({
|
|
@@ -204,6 +278,9 @@ Bad examples:
|
|
|
204
278
|
event: 'completed',
|
|
205
279
|
logId,
|
|
206
280
|
message: 'Context curated successfully',
|
|
281
|
+
...(pendingReview
|
|
282
|
+
? { pendingReview: this.buildPendingReviewJson(pendingReview.pendingCount, pendingOps, tid) }
|
|
283
|
+
: {}),
|
|
207
284
|
status: 'completed',
|
|
208
285
|
taskId: tid,
|
|
209
286
|
},
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { type DaemonClientOptions } from '../lib/daemon-client.js';
|
|
3
|
+
export default class Init extends Command {
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static flags: {
|
|
7
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
};
|
|
9
|
+
static hidden: boolean;
|
|
10
|
+
protected getDaemonOptions(): DaemonClientOptions;
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* eslint-disable no-unreachable */
|
|
2
|
+
import { Command, Flags } from '@oclif/core';
|
|
3
|
+
import { InitEvents } from '../../shared/transport/events/init-events.js';
|
|
4
|
+
import { ProviderEvents } from '../../shared/transport/events/provider-events.js';
|
|
5
|
+
import { formatConnectionError, withDaemonRetry } from '../lib/daemon-client.js';
|
|
6
|
+
export default class Init extends Command {
|
|
7
|
+
static description = 'Initialize a ByteRover project in the current directory';
|
|
8
|
+
static examples = ['<%= config.bin %> <%= command.id %>', '<%= config.bin %> <%= command.id %> --force'];
|
|
9
|
+
static flags = {
|
|
10
|
+
force: Flags.boolean({
|
|
11
|
+
char: 'f',
|
|
12
|
+
default: false,
|
|
13
|
+
description: 'Force re-initialization even if already initialized',
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
static hidden = true;
|
|
17
|
+
getDaemonOptions() {
|
|
18
|
+
return { projectPath: process.cwd() };
|
|
19
|
+
}
|
|
20
|
+
async run() {
|
|
21
|
+
this.log('The init command is not available. Use: brv vc init');
|
|
22
|
+
return;
|
|
23
|
+
const { flags } = await this.parse(Init);
|
|
24
|
+
const daemonOptions = this.getDaemonOptions();
|
|
25
|
+
// Step 1: Local init (.brv/config.json + context tree)
|
|
26
|
+
try {
|
|
27
|
+
const response = await withDaemonRetry(async (client) => client.requestWithAck(InitEvents.LOCAL, { force: flags.force }), daemonOptions);
|
|
28
|
+
if (response.alreadyInitialized) {
|
|
29
|
+
this.log('ByteRover project already initialized.');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
this.log(formatConnectionError(error));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Step 2: Version control init
|
|
38
|
+
try {
|
|
39
|
+
await this.config.runCommand('vc:init');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// vc:init logs its own errors
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Step 3: Provider setup — only if no provider connected yet
|
|
46
|
+
let activeProviderId;
|
|
47
|
+
try {
|
|
48
|
+
const result = await withDaemonRetry(async (client) => client.requestWithAck(ProviderEvents.GET_ACTIVE), daemonOptions);
|
|
49
|
+
activeProviderId = result.activeProviderId;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.log(formatConnectionError(error));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!activeProviderId) {
|
|
56
|
+
try {
|
|
57
|
+
await this.config.runCommand('providers:connect');
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// providers:connect logs its own errors
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Step 4: Connector setup — interactive agent selection + default connector
|
|
65
|
+
try {
|
|
66
|
+
await this.config.runCommand('connectors:install');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// connector setup is optional
|
|
70
|
+
}
|
|
71
|
+
this.log(`\nByteRover is ready in ${process.cwd()}`);
|
|
72
|
+
this.log(' Ask your coding agent to curate your project —');
|
|
73
|
+
this.log(' try "hey, curate the context for this project"');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -24,7 +24,7 @@ export default class Locations extends Command {
|
|
|
24
24
|
const { flags } = await this.parse(Locations);
|
|
25
25
|
const isJson = flags.format === 'json';
|
|
26
26
|
try {
|
|
27
|
-
const locations = await this.fetchLocations();
|
|
27
|
+
const locations = await this.fetchLocations({ projectPath: process.cwd() });
|
|
28
28
|
if (isJson) {
|
|
29
29
|
writeJsonResponse({ command: 'locations', data: { locations }, success: true });
|
|
30
30
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Command } from '@oclif/core';
|
|
2
|
+
import type { ProviderDTO } from '../../../shared/transport/types/dto.js';
|
|
3
|
+
import { type ModelListResponse } from '../../../shared/transport/events/model-events.js';
|
|
2
4
|
import { type DaemonClientOptions } from '../../lib/daemon-client.js';
|
|
3
5
|
export default class ProviderConnect extends Command {
|
|
4
6
|
static args: {
|
|
5
|
-
provider: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
provider: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
6
8
|
};
|
|
7
9
|
static description: string;
|
|
8
10
|
static examples: string[];
|
|
@@ -31,5 +33,33 @@ export default class ProviderConnect extends Command {
|
|
|
31
33
|
providerName: string;
|
|
32
34
|
showInstructions: boolean;
|
|
33
35
|
}>;
|
|
36
|
+
protected disconnectProvider(providerId: string, options?: DaemonClientOptions): Promise<void>;
|
|
37
|
+
protected fetchModels(providerId: string, options?: DaemonClientOptions): Promise<ModelListResponse>;
|
|
38
|
+
protected fetchProviders(options?: DaemonClientOptions): Promise<ProviderDTO[]>;
|
|
39
|
+
protected promptForApiKey(providerName: string, apiKeyUrl?: string, signal?: AbortSignal): Promise<string>;
|
|
40
|
+
protected promptForAuthMethod(provider: ProviderDTO, signal?: AbortSignal): Promise<'api-key' | 'oauth'>;
|
|
41
|
+
protected promptForBaseUrl(signal?: AbortSignal): Promise<string>;
|
|
42
|
+
protected promptForConnectedAction(provider: ProviderDTO, signal?: AbortSignal): Promise<'activate' | 'disconnect' | 'reconfigure'>;
|
|
43
|
+
protected promptForModel(models: {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
}[], signal?: AbortSignal): Promise<string | undefined>;
|
|
47
|
+
protected promptForOptionalApiKey(providerName: string, signal?: AbortSignal): Promise<string | undefined>;
|
|
48
|
+
protected promptForProvider(providers: ProviderDTO[], signal?: AbortSignal): Promise<string>;
|
|
34
49
|
run(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Interactive flow with cancel-to-go-back navigation.
|
|
52
|
+
* Step 1 (provider) ← Step 2 (auth) ← Step 3 (model)
|
|
53
|
+
*/
|
|
54
|
+
protected runInteractive(): Promise<void>;
|
|
55
|
+
protected runNonInteractive(providerId: string, flags: {
|
|
56
|
+
apiKey: string | undefined;
|
|
57
|
+
baseUrl: string | undefined;
|
|
58
|
+
code: string | undefined;
|
|
59
|
+
model: string | undefined;
|
|
60
|
+
oauth: boolean;
|
|
61
|
+
}, format: 'json' | 'text'): Promise<void>;
|
|
62
|
+
/** Returns true when wizard should end (skip model step), false to continue to model step. */
|
|
63
|
+
private runAuthStep;
|
|
64
|
+
private runModelStep;
|
|
35
65
|
}
|