vibe-squire 1.0.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/README.md +179 -0
- package/bin/vibe-squire.js +3 -0
- package/dist/prisma.config.d.ts +3 -0
- package/dist/prisma.config.js +14 -0
- package/dist/prisma.config.js.map +1 -0
- package/dist/src/app.controller.d.ts +3 -0
- package/dist/src/app.controller.js +30 -0
- package/dist/src/app.controller.js.map +1 -0
- package/dist/src/app.module.d.ts +5 -0
- package/dist/src/app.module.js +56 -0
- package/dist/src/app.module.js.map +1 -0
- package/dist/src/config/app-env.token.d.ts +14 -0
- package/dist/src/config/app-env.token.js +5 -0
- package/dist/src/config/app-env.token.js.map +1 -0
- package/dist/src/config/env-schema.d.ts +28 -0
- package/dist/src/config/env-schema.js +43 -0
- package/dist/src/config/env-schema.js.map +1 -0
- package/dist/src/config/env.module.d.ts +5 -0
- package/dist/src/config/env.module.js +27 -0
- package/dist/src/config/env.module.js.map +1 -0
- package/dist/src/config/integration-types.d.ts +4 -0
- package/dist/src/config/integration-types.js +6 -0
- package/dist/src/config/integration-types.js.map +1 -0
- package/dist/src/config/vk-executors.d.ts +5 -0
- package/dist/src/config/vk-executors.js +21 -0
- package/dist/src/config/vk-executors.js.map +1 -0
- package/dist/src/configure-express-app.d.ts +2 -0
- package/dist/src/configure-express-app.js +74 -0
- package/dist/src/configure-express-app.js.map +1 -0
- package/dist/src/database/resolve-database-url.d.ts +2 -0
- package/dist/src/database/resolve-database-url.js +46 -0
- package/dist/src/database/resolve-database-url.js.map +1 -0
- package/dist/src/database/sqlite-migrate.d.ts +1 -0
- package/dist/src/database/sqlite-migrate.js +77 -0
- package/dist/src/database/sqlite-migrate.js.map +1 -0
- package/dist/src/events/integration-settings-emitter.service.d.ts +6 -0
- package/dist/src/events/integration-settings-emitter.service.js +30 -0
- package/dist/src/events/integration-settings-emitter.service.js.map +1 -0
- package/dist/src/events/integration-settings.events.d.ts +1 -0
- package/dist/src/events/integration-settings.events.js +5 -0
- package/dist/src/events/integration-settings.events.js.map +1 -0
- package/dist/src/events/status-events.module.d.ts +2 -0
- package/dist/src/events/status-events.module.js +23 -0
- package/dist/src/events/status-events.module.js.map +1 -0
- package/dist/src/events/status-events.service.d.ts +8 -0
- package/dist/src/events/status-events.service.js +32 -0
- package/dist/src/events/status-events.service.js.map +1 -0
- package/dist/src/generated/prisma/browser.d.ts +10 -0
- package/dist/src/generated/prisma/browser.js +44 -0
- package/dist/src/generated/prisma/browser.js.map +1 -0
- package/dist/src/generated/prisma/client.d.ts +14 -0
- package/dist/src/generated/prisma/client.js +46 -0
- package/dist/src/generated/prisma/client.js.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts +333 -0
- package/dist/src/generated/prisma/commonInputTypes.js +3 -0
- package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
- package/dist/src/generated/prisma/enums.d.ts +1 -0
- package/dist/src/generated/prisma/enums.js +3 -0
- package/dist/src/generated/prisma/enums.js.map +1 -0
- package/dist/src/generated/prisma/internal/class.d.ts +50 -0
- package/dist/src/generated/prisma/internal/class.js +75 -0
- package/dist/src/generated/prisma/internal/class.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +789 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js +145 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +104 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +129 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/src/generated/prisma/models/PollRun.d.ts +858 -0
- package/dist/src/generated/prisma/models/PollRun.js +3 -0
- package/dist/src/generated/prisma/models/PollRun.js.map +1 -0
- package/dist/src/generated/prisma/models/PollRunItem.d.ts +742 -0
- package/dist/src/generated/prisma/models/PollRunItem.js +3 -0
- package/dist/src/generated/prisma/models/PollRunItem.js.map +1 -0
- package/dist/src/generated/prisma/models/RepoProjectMapping.d.ts +429 -0
- package/dist/src/generated/prisma/models/RepoProjectMapping.js +3 -0
- package/dist/src/generated/prisma/models/RepoProjectMapping.js.map +1 -0
- package/dist/src/generated/prisma/models/ScoutState.d.ts +573 -0
- package/dist/src/generated/prisma/models/ScoutState.js +3 -0
- package/dist/src/generated/prisma/models/ScoutState.js.map +1 -0
- package/dist/src/generated/prisma/models/Setting.d.ts +348 -0
- package/dist/src/generated/prisma/models/Setting.js +3 -0
- package/dist/src/generated/prisma/models/Setting.js.map +1 -0
- package/dist/src/generated/prisma/models/SyncedPullRequest.d.ts +538 -0
- package/dist/src/generated/prisma/models/SyncedPullRequest.js +3 -0
- package/dist/src/generated/prisma/models/SyncedPullRequest.js.map +1 -0
- package/dist/src/generated/prisma/models.d.ts +7 -0
- package/dist/src/generated/prisma/models.js +3 -0
- package/dist/src/generated/prisma/models.js.map +1 -0
- package/dist/src/integrations/github/gh-cli.service.d.ts +7 -0
- package/dist/src/integrations/github/gh-cli.service.js +41 -0
- package/dist/src/integrations/github/gh-cli.service.js.map +1 -0
- package/dist/src/integrations/github/github-pr-scout.service.d.ts +6 -0
- package/dist/src/integrations/github/github-pr-scout.service.js +78 -0
- package/dist/src/integrations/github/github-pr-scout.service.js.map +1 -0
- package/dist/src/integrations/github/github-search-prs.schema.d.ts +28 -0
- package/dist/src/integrations/github/github-search-prs.schema.js +21 -0
- package/dist/src/integrations/github/github-search-prs.schema.js.map +1 -0
- package/dist/src/integrations/github/github-settings-group.service.d.ts +10 -0
- package/dist/src/integrations/github/github-settings-group.service.js +22 -0
- package/dist/src/integrations/github/github-settings-group.service.js.map +1 -0
- package/dist/src/integrations/github/github-settings.schema.d.ts +16 -0
- package/dist/src/integrations/github/github-settings.schema.js +57 -0
- package/dist/src/integrations/github/github-settings.schema.js.map +1 -0
- package/dist/src/integrations/github/github-settings.service.d.ts +10 -0
- package/dist/src/integrations/github/github-settings.service.js +46 -0
- package/dist/src/integrations/github/github-settings.service.js.map +1 -0
- package/dist/src/integrations/github/github-source-status.service.d.ts +8 -0
- package/dist/src/integrations/github/github-source-status.service.js +55 -0
- package/dist/src/integrations/github/github-source-status.service.js.map +1 -0
- package/dist/src/integrations/github/github-source.module.d.ts +2 -0
- package/dist/src/integrations/github/github-source.module.js +74 -0
- package/dist/src/integrations/github/github-source.module.js.map +1 -0
- package/dist/src/integrations/github/github-ui.controller.d.ts +14 -0
- package/dist/src/integrations/github/github-ui.controller.js +94 -0
- package/dist/src/integrations/github/github-ui.controller.js.map +1 -0
- package/dist/src/integrations/integrations.module.d.ts +5 -0
- package/dist/src/integrations/integrations.module.js +38 -0
- package/dist/src/integrations/integrations.module.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vibe-kanban-destination.module.d.ts +2 -0
- package/dist/src/integrations/vibe-kanban/vibe-kanban-destination.module.js +98 -0
- package/dist/src/integrations/vibe-kanban/vibe-kanban-destination.module.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-board-adapter.service.d.ts +24 -0
- package/dist/src/integrations/vibe-kanban/vk-board-adapter.service.js +73 -0
- package/dist/src/integrations/vibe-kanban/vk-board-adapter.service.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-mcp-integration.listener.d.ts +18 -0
- package/dist/src/integrations/vibe-kanban/vk-mcp-integration.listener.js +104 -0
- package/dist/src/integrations/vibe-kanban/vk-mcp-integration.listener.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-settings-group.service.d.ts +14 -0
- package/dist/src/integrations/vibe-kanban/vk-settings-group.service.js +22 -0
- package/dist/src/integrations/vibe-kanban/vk-settings-group.service.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-settings.schema.d.ts +16 -0
- package/dist/src/integrations/vibe-kanban/vk-settings.schema.js +38 -0
- package/dist/src/integrations/vibe-kanban/vk-settings.schema.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-settings.service.d.ts +12 -0
- package/dist/src/integrations/vibe-kanban/vk-settings.service.js +51 -0
- package/dist/src/integrations/vibe-kanban/vk-settings.service.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-status.service.d.ts +14 -0
- package/dist/src/integrations/vibe-kanban/vk-status.service.js +89 -0
- package/dist/src/integrations/vibe-kanban/vk-status.service.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-ui.controller.d.ts +16 -0
- package/dist/src/integrations/vibe-kanban/vk-ui.controller.js +100 -0
- package/dist/src/integrations/vibe-kanban/vk-ui.controller.js.map +1 -0
- package/dist/src/integrations/vibe-kanban/vk-workspace-executors.d.ts +1 -0
- package/dist/src/integrations/vibe-kanban/vk-workspace-executors.js +7 -0
- package/dist/src/integrations/vibe-kanban/vk-workspace-executors.js.map +1 -0
- package/dist/src/logging/create-logger-params.d.ts +3 -0
- package/dist/src/logging/create-logger-params.js +56 -0
- package/dist/src/logging/create-logger-params.js.map +1 -0
- package/dist/src/logging/redact-urls.d.ts +1 -0
- package/dist/src/logging/redact-urls.js +7 -0
- package/dist/src/logging/redact-urls.js.map +1 -0
- package/dist/src/main.d.ts +1 -0
- package/dist/src/main.js +40 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/mappings/dto/create-mapping.dto.d.ts +5 -0
- package/dist/src/mappings/dto/create-mapping.dto.js +42 -0
- package/dist/src/mappings/dto/create-mapping.dto.js.map +1 -0
- package/dist/src/mappings/dto/update-mapping.dto.d.ts +5 -0
- package/dist/src/mappings/dto/update-mapping.dto.js +44 -0
- package/dist/src/mappings/dto/update-mapping.dto.js.map +1 -0
- package/dist/src/mappings/mappings.controller.d.ts +36 -0
- package/dist/src/mappings/mappings.controller.js +97 -0
- package/dist/src/mappings/mappings.controller.js.map +1 -0
- package/dist/src/mappings/mappings.module.d.ts +2 -0
- package/dist/src/mappings/mappings.module.js +25 -0
- package/dist/src/mappings/mappings.module.js.map +1 -0
- package/dist/src/mappings/mappings.service.d.ts +34 -0
- package/dist/src/mappings/mappings.service.js +96 -0
- package/dist/src/mappings/mappings.service.js.map +1 -0
- package/dist/src/ports/destination-board.port.d.ts +37 -0
- package/dist/src/ports/destination-board.port.js +3 -0
- package/dist/src/ports/destination-board.port.js.map +1 -0
- package/dist/src/ports/destination-status.port.d.ts +17 -0
- package/dist/src/ports/destination-status.port.js +3 -0
- package/dist/src/ports/destination-status.port.js.map +1 -0
- package/dist/src/ports/github-pr-candidate.d.ts +9 -0
- package/dist/src/ports/github-pr-candidate.js +3 -0
- package/dist/src/ports/github-pr-candidate.js.map +1 -0
- package/dist/src/ports/github-scout.port.d.ts +2 -0
- package/dist/src/ports/github-scout.port.js +3 -0
- package/dist/src/ports/github-scout.port.js.map +1 -0
- package/dist/src/ports/injection-tokens.d.ts +8 -0
- package/dist/src/ports/injection-tokens.js +12 -0
- package/dist/src/ports/injection-tokens.js.map +1 -0
- package/dist/src/ports/source-status.port.d.ts +14 -0
- package/dist/src/ports/source-status.port.js +3 -0
- package/dist/src/ports/source-status.port.js.map +1 -0
- package/dist/src/ports/sync-pr-scout.port.d.ts +4 -0
- package/dist/src/ports/sync-pr-scout.port.js +3 -0
- package/dist/src/ports/sync-pr-scout.port.js.map +1 -0
- package/dist/src/ports/ui-nav.types.d.ts +5 -0
- package/dist/src/ports/ui-nav.types.js +3 -0
- package/dist/src/ports/ui-nav.types.js.map +1 -0
- package/dist/src/ports/vk-mcp-stdio-session.port.d.ts +5 -0
- package/dist/src/ports/vk-mcp-stdio-session.port.js +3 -0
- package/dist/src/ports/vk-mcp-stdio-session.port.js.map +1 -0
- package/dist/src/prisma/prisma.module.d.ts +2 -0
- package/dist/src/prisma/prisma.module.js +22 -0
- package/dist/src/prisma/prisma.module.js.map +1 -0
- package/dist/src/prisma/prisma.service.d.ts +8 -0
- package/dist/src/prisma/prisma.service.js +39 -0
- package/dist/src/prisma/prisma.service.js.map +1 -0
- package/dist/src/reinit/reinit.controller.d.ts +20 -0
- package/dist/src/reinit/reinit.controller.js +43 -0
- package/dist/src/reinit/reinit.controller.js.map +1 -0
- package/dist/src/reinit/reinit.module.d.ts +2 -0
- package/dist/src/reinit/reinit.module.js +25 -0
- package/dist/src/reinit/reinit.module.js.map +1 -0
- package/dist/src/reinit/reinit.service.d.ts +33 -0
- package/dist/src/reinit/reinit.service.js +150 -0
- package/dist/src/reinit/reinit.service.js.map +1 -0
- package/dist/src/settings/core-settings-group.service.d.ts +18 -0
- package/dist/src/settings/core-settings-group.service.js +22 -0
- package/dist/src/settings/core-settings-group.service.js.map +1 -0
- package/dist/src/settings/core-settings.schema.d.ts +35 -0
- package/dist/src/settings/core-settings.schema.js +72 -0
- package/dist/src/settings/core-settings.schema.js.map +1 -0
- package/dist/src/settings/core-settings.service.d.ts +13 -0
- package/dist/src/settings/core-settings.service.js +55 -0
- package/dist/src/settings/core-settings.service.js.map +1 -0
- package/dist/src/settings/dto/patch-settings-body.schema.d.ts +2 -0
- package/dist/src/settings/dto/patch-settings-body.schema.js +7 -0
- package/dist/src/settings/dto/patch-settings-body.schema.js.map +1 -0
- package/dist/src/settings/dto/patch-settings.dto.d.ts +8 -0
- package/dist/src/settings/dto/patch-settings.dto.js +14 -0
- package/dist/src/settings/dto/patch-settings.dto.js.map +1 -0
- package/dist/src/settings/parse-settings-patch.d.ts +6 -0
- package/dist/src/settings/parse-settings-patch.js +33 -0
- package/dist/src/settings/parse-settings-patch.js.map +1 -0
- package/dist/src/settings/resolve-effective-setting.d.ts +1 -0
- package/dist/src/settings/resolve-effective-setting.js +13 -0
- package/dist/src/settings/resolve-effective-setting.js.map +1 -0
- package/dist/src/settings/setting-definition.d.ts +4 -0
- package/dist/src/settings/setting-definition.js +3 -0
- package/dist/src/settings/setting-definition.js.map +1 -0
- package/dist/src/settings/settings-catalog.service.d.ts +15 -0
- package/dist/src/settings/settings-catalog.service.js +68 -0
- package/dist/src/settings/settings-catalog.service.js.map +1 -0
- package/dist/src/settings/settings-group.base.d.ts +15 -0
- package/dist/src/settings/settings-group.base.js +35 -0
- package/dist/src/settings/settings-group.base.js.map +1 -0
- package/dist/src/settings/settings-group.tokens.d.ts +3 -0
- package/dist/src/settings/settings-group.tokens.js +6 -0
- package/dist/src/settings/settings-group.tokens.js.map +1 -0
- package/dist/src/settings/settings.controller.d.ts +16 -0
- package/dist/src/settings/settings.controller.js +116 -0
- package/dist/src/settings/settings.controller.js.map +1 -0
- package/dist/src/settings/settings.module.d.ts +2 -0
- package/dist/src/settings/settings.module.js +39 -0
- package/dist/src/settings/settings.module.js.map +1 -0
- package/dist/src/settings/settings.service.d.ts +25 -0
- package/dist/src/settings/settings.service.js +112 -0
- package/dist/src/settings/settings.service.js.map +1 -0
- package/dist/src/setup/setup-complete.guard.d.ts +7 -0
- package/dist/src/setup/setup-complete.guard.js +36 -0
- package/dist/src/setup/setup-complete.guard.js.map +1 -0
- package/dist/src/setup/setup-evaluation.service.d.ts +19 -0
- package/dist/src/setup/setup-evaluation.service.js +64 -0
- package/dist/src/setup/setup-evaluation.service.js.map +1 -0
- package/dist/src/setup/setup.module.d.ts +2 -0
- package/dist/src/setup/setup.module.js +23 -0
- package/dist/src/setup/setup.module.js.map +1 -0
- package/dist/src/status/dto/status-snapshot.dto.d.ts +37 -0
- package/dist/src/status/dto/status-snapshot.dto.js +168 -0
- package/dist/src/status/dto/status-snapshot.dto.js.map +1 -0
- package/dist/src/status/status-snapshot.contract.d.ts +1 -0
- package/dist/src/status/status-snapshot.contract.js +7 -0
- package/dist/src/status/status-snapshot.contract.js.map +1 -0
- package/dist/src/status/status-snapshot.schema.d.ts +61 -0
- package/dist/src/status/status-snapshot.schema.js +60 -0
- package/dist/src/status/status-snapshot.schema.js.map +1 -0
- package/dist/src/status/status.controller.d.ts +57 -0
- package/dist/src/status/status.controller.js +63 -0
- package/dist/src/status/status.controller.js.map +1 -0
- package/dist/src/status/status.module.d.ts +2 -0
- package/dist/src/status/status.module.js +28 -0
- package/dist/src/status/status.module.js.map +1 -0
- package/dist/src/status/status.service.d.ts +67 -0
- package/dist/src/status/status.service.js +147 -0
- package/dist/src/status/status.service.js.map +1 -0
- package/dist/src/sync/poll-backoff.d.ts +10 -0
- package/dist/src/sync/poll-backoff.js +22 -0
- package/dist/src/sync/poll-backoff.js.map +1 -0
- package/dist/src/sync/poll-cycle/ensure-issue-for-pr.d.ts +18 -0
- package/dist/src/sync/poll-cycle/ensure-issue-for-pr.js +166 -0
- package/dist/src/sync/poll-cycle/ensure-issue-for-pr.js.map +1 -0
- package/dist/src/sync/poll-cycle/ensure-issue-outcome.d.ts +14 -0
- package/dist/src/sync/poll-cycle/ensure-issue-outcome.js +3 -0
- package/dist/src/sync/poll-cycle/ensure-issue-outcome.js.map +1 -0
- package/dist/src/sync/poll-cycle/finalize-successful-poll-cycle.d.ts +16 -0
- package/dist/src/sync/poll-cycle/finalize-successful-poll-cycle.js +37 -0
- package/dist/src/sync/poll-cycle/finalize-successful-poll-cycle.js.map +1 -0
- package/dist/src/sync/poll-cycle/kanban-terminal-status.d.ts +1 -0
- package/dist/src/sync/poll-cycle/kanban-terminal-status.js +15 -0
- package/dist/src/sync/poll-cycle/kanban-terminal-status.js.map +1 -0
- package/dist/src/sync/poll-cycle/mcp-network-error-heuristic.d.ts +1 -0
- package/dist/src/sync/poll-cycle/mcp-network-error-heuristic.js +13 -0
- package/dist/src/sync/poll-cycle/mcp-network-error-heuristic.js.map +1 -0
- package/dist/src/sync/poll-cycle/persist-scout-run-outcome.d.ts +16 -0
- package/dist/src/sync/poll-cycle/persist-scout-run-outcome.js +61 -0
- package/dist/src/sync/poll-cycle/persist-scout-run-outcome.js.map +1 -0
- package/dist/src/sync/poll-cycle/poll-pr-kanban-copy.d.ts +4 -0
- package/dist/src/sync/poll-cycle/poll-pr-kanban-copy.js +24 -0
- package/dist/src/sync/poll-cycle/poll-pr-kanban-copy.js.map +1 -0
- package/dist/src/sync/poll-cycle/poll-scout-context.d.ts +23 -0
- package/dist/src/sync/poll-cycle/poll-scout-context.js +46 -0
- package/dist/src/sync/poll-cycle/poll-scout-context.js.map +1 -0
- package/dist/src/sync/poll-cycle/process-poll-candidates.d.ts +26 -0
- package/dist/src/sync/poll-cycle/process-poll-candidates.js +69 -0
- package/dist/src/sync/poll-cycle/process-poll-candidates.js.map +1 -0
- package/dist/src/sync/poll-cycle/reconcile-removed-sync-rows.d.ts +9 -0
- package/dist/src/sync/poll-cycle/reconcile-removed-sync-rows.js +40 -0
- package/dist/src/sync/poll-cycle/reconcile-removed-sync-rows.js.map +1 -0
- package/dist/src/sync/poll-cycle/run-poll-prerequisites.d.ts +13 -0
- package/dist/src/sync/poll-cycle/run-poll-prerequisites.js +25 -0
- package/dist/src/sync/poll-cycle/run-poll-prerequisites.js.map +1 -0
- package/dist/src/sync/poll-run-decisions.d.ts +16 -0
- package/dist/src/sync/poll-run-decisions.js +18 -0
- package/dist/src/sync/poll-run-decisions.js.map +1 -0
- package/dist/src/sync/poll-run-history.service.d.ts +58 -0
- package/dist/src/sync/poll-run-history.service.js +126 -0
- package/dist/src/sync/poll-run-history.service.js.map +1 -0
- package/dist/src/sync/poll-run-labels.d.ts +2 -0
- package/dist/src/sync/poll-run-labels.js +32 -0
- package/dist/src/sync/poll-run-labels.js.map +1 -0
- package/dist/src/sync/poll-scheduler.service.d.ts +22 -0
- package/dist/src/sync/poll-scheduler.service.js +124 -0
- package/dist/src/sync/poll-scheduler.service.js.map +1 -0
- package/dist/src/sync/pr-ignore-author-logins.d.ts +1 -0
- package/dist/src/sync/pr-ignore-author-logins.js +11 -0
- package/dist/src/sync/pr-ignore-author-logins.js.map +1 -0
- package/dist/src/sync/pr-review-template.d.ts +2 -0
- package/dist/src/sync/pr-review-template.js +11 -0
- package/dist/src/sync/pr-review-template.js.map +1 -0
- package/dist/src/sync/run-poll-cycle.service.d.ts +32 -0
- package/dist/src/sync/run-poll-cycle.service.js +234 -0
- package/dist/src/sync/run-poll-cycle.service.js.map +1 -0
- package/dist/src/sync/sync-constants.d.ts +3 -0
- package/dist/src/sync/sync-constants.js +7 -0
- package/dist/src/sync/sync-constants.js.map +1 -0
- package/dist/src/sync/sync-dependencies.guard.d.ts +9 -0
- package/dist/src/sync/sync-dependencies.guard.js +54 -0
- package/dist/src/sync/sync-dependencies.guard.js.map +1 -0
- package/dist/src/sync/sync-run-state.module.d.ts +2 -0
- package/dist/src/sync/sync-run-state.module.js +21 -0
- package/dist/src/sync/sync-run-state.module.js.map +1 -0
- package/dist/src/sync/sync-run-state.service.d.ts +16 -0
- package/dist/src/sync/sync-run-state.service.js +38 -0
- package/dist/src/sync/sync-run-state.service.js.map +1 -0
- package/dist/src/sync/sync.controller.d.ts +10 -0
- package/dist/src/sync/sync.controller.js +60 -0
- package/dist/src/sync/sync.controller.js.map +1 -0
- package/dist/src/sync/sync.module.d.ts +2 -0
- package/dist/src/sync/sync.module.js +43 -0
- package/dist/src/sync/sync.module.js.map +1 -0
- package/dist/src/sync/sync.service.d.ts +18 -0
- package/dist/src/sync/sync.service.js +70 -0
- package/dist/src/sync/sync.service.js.map +1 -0
- package/dist/src/ui/activity-api.controller.d.ts +37 -0
- package/dist/src/ui/activity-api.controller.js +58 -0
- package/dist/src/ui/activity-api.controller.js.map +1 -0
- package/dist/src/ui/integration-ui-registry.d.ts +6 -0
- package/dist/src/ui/integration-ui-registry.js +27 -0
- package/dist/src/ui/integration-ui-registry.js.map +1 -0
- package/dist/src/ui/setting-labels.d.ts +11 -0
- package/dist/src/ui/setting-labels.js +34 -0
- package/dist/src/ui/setting-labels.js.map +1 -0
- package/dist/src/ui/ui-nav.service.d.ts +10 -0
- package/dist/src/ui/ui-nav.service.js +48 -0
- package/dist/src/ui/ui-nav.service.js.map +1 -0
- package/dist/src/ui/ui-presenter.d.ts +51 -0
- package/dist/src/ui/ui-presenter.js +116 -0
- package/dist/src/ui/ui-presenter.js.map +1 -0
- package/dist/src/ui/ui-vibe-kanban-presenter.d.ts +15 -0
- package/dist/src/ui/ui-vibe-kanban-presenter.js +70 -0
- package/dist/src/ui/ui-vibe-kanban-presenter.js.map +1 -0
- package/dist/src/ui/ui.controller.d.ts +32 -0
- package/dist/src/ui/ui.controller.js +212 -0
- package/dist/src/ui/ui.controller.js.map +1 -0
- package/dist/src/ui/ui.module.d.ts +2 -0
- package/dist/src/ui/ui.module.js +30 -0
- package/dist/src/ui/ui.module.js.map +1 -0
- package/dist/src/vibe-kanban/mcp-result/mcp-tool-result-text.d.ts +3 -0
- package/dist/src/vibe-kanban/mcp-result/mcp-tool-result-text.js +26 -0
- package/dist/src/vibe-kanban/mcp-result/mcp-tool-result-text.js.map +1 -0
- package/dist/src/vibe-kanban/mcp-result/vk-mcp-list-get-issue-response.schema.d.ts +80 -0
- package/dist/src/vibe-kanban/mcp-result/vk-mcp-list-get-issue-response.schema.js +58 -0
- package/dist/src/vibe-kanban/mcp-result/vk-mcp-list-get-issue-response.schema.js.map +1 -0
- package/dist/src/vibe-kanban/mcp-result/vk-mcp-tool-result.d.ts +10 -0
- package/dist/src/vibe-kanban/mcp-result/vk-mcp-tool-result.js +169 -0
- package/dist/src/vibe-kanban/mcp-result/vk-mcp-tool-result.js.map +1 -0
- package/dist/src/vibe-kanban/transport/mcp-transport-config.d.ts +5 -0
- package/dist/src/vibe-kanban/transport/mcp-transport-config.js +16 -0
- package/dist/src/vibe-kanban/transport/mcp-transport-config.js.map +1 -0
- package/dist/src/vibe-kanban/transport/vk-mcp-stdio-session.service.d.ts +20 -0
- package/dist/src/vibe-kanban/transport/vk-mcp-stdio-session.service.js +124 -0
- package/dist/src/vibe-kanban/transport/vk-mcp-stdio-session.service.js.map +1 -0
- package/dist/src/vibe-kanban/transport/vk-stdio-command.schema.d.ts +9 -0
- package/dist/src/vibe-kanban/transport/vk-stdio-command.schema.js +37 -0
- package/dist/src/vibe-kanban/transport/vk-stdio-command.schema.js.map +1 -0
- package/dist/src/vibe-kanban/vibe-kanban-context.controller.d.ts +14 -0
- package/dist/src/vibe-kanban/vibe-kanban-context.controller.js +105 -0
- package/dist/src/vibe-kanban/vibe-kanban-context.controller.js.map +1 -0
- package/dist/src/vibe-kanban/vibe-kanban-mcp-configured.guard.d.ts +7 -0
- package/dist/src/vibe-kanban/vibe-kanban-mcp-configured.guard.js +37 -0
- package/dist/src/vibe-kanban/vibe-kanban-mcp-configured.guard.js.map +1 -0
- package/dist/src/vibe-kanban/vibe-kanban-mcp.service.d.ts +51 -0
- package/dist/src/vibe-kanban/vibe-kanban-mcp.service.js +225 -0
- package/dist/src/vibe-kanban/vibe-kanban-mcp.service.js.map +1 -0
- package/dist/src/vibe-kanban/vibe-kanban-query.schema.d.ts +4 -0
- package/dist/src/vibe-kanban/vibe-kanban-query.schema.js +8 -0
- package/dist/src/vibe-kanban/vibe-kanban-query.schema.js.map +1 -0
- package/dist/src/vibe-kanban/vk-board-cap.d.ts +5 -0
- package/dist/src/vibe-kanban/vk-board-cap.js +31 -0
- package/dist/src/vibe-kanban/vk-board-cap.js.map +1 -0
- package/dist/src/vibe-kanban/vk-contract.d.ts +3 -0
- package/dist/src/vibe-kanban/vk-contract.js +10 -0
- package/dist/src/vibe-kanban/vk-contract.js.map +1 -0
- package/dist/src/vibe-kanban/vk-entities.d.ts +20 -0
- package/dist/src/vibe-kanban/vk-entities.js +3 -0
- package/dist/src/vibe-kanban/vk-entities.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/ui/public/operator-activity.js +223 -0
- package/dist/ui/public/operator-dashboard.js +295 -0
- package/dist/ui/public/operator-mappings.js +97 -0
- package/dist/ui/public/operator-shell.js +43 -0
- package/dist/ui/public/operator-ui-shared.js +40 -0
- package/dist/ui/public/operator-vibe-kanban.js +90 -0
- package/dist/ui/public/operator.css +706 -0
- package/dist/ui/views/activity.hbs +14 -0
- package/dist/ui/views/dashboard.hbs +51 -0
- package/dist/ui/views/github.hbs +36 -0
- package/dist/ui/views/mappings.hbs +98 -0
- package/dist/ui/views/partials/layout.hbs +27 -0
- package/dist/ui/views/partials/nav.hbs +45 -0
- package/dist/ui/views/settings.hbs +69 -0
- package/dist/ui/views/vibe-kanban.hbs +95 -0
- package/package.json +115 -0
- package/prisma/migrations/20260325063706_init/migration.sql +29 -0
- package/prisma/migrations/20260325065127_synced_pull_requests/migration.sql +20 -0
- package/prisma/migrations/20260325070037_scout_failure_streak/migration.sql +16 -0
- package/prisma/migrations/20260325071958_scout_last_poll_stats/migration.sql +4 -0
- package/prisma/migrations/20260325120556_kanban_repo_and_workspace/migration.sql +28 -0
- package/prisma/migrations/20260325151849_poll_run_history/migration.sql +37 -0
- package/prisma/migrations/20260326064926_poll_run_skipped_board_limit/migration.sql +2 -0
- package/prisma/migrations/20260326120000_drop_runtime_integration_settings/migration.sql +2 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +100 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
var Ui = window.VibeSquireUi;
|
|
3
|
+
if (!Ui) return;
|
|
4
|
+
|
|
5
|
+
var root = document.getElementById('activity-runs-root');
|
|
6
|
+
if (!root) return;
|
|
7
|
+
|
|
8
|
+
var POLL_WHILE_RUNNING_MS = 2500;
|
|
9
|
+
var esc = Ui.esc;
|
|
10
|
+
var fmtIso = Ui.fmtIso;
|
|
11
|
+
|
|
12
|
+
function fmtCount(v) {
|
|
13
|
+
return v == null ? '—' : String(v);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function renderItemsTable(items) {
|
|
17
|
+
if (!items || !items.length) return '';
|
|
18
|
+
var rows = items
|
|
19
|
+
.map(function (it) {
|
|
20
|
+
var detailParts = [];
|
|
21
|
+
if (it.kanbanIssueId) {
|
|
22
|
+
detailParts.push(
|
|
23
|
+
'<span class="mono">issue ' + esc(it.kanbanIssueId) + '</span>',
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
if (it.detail) {
|
|
27
|
+
detailParts.push(esc(it.detail));
|
|
28
|
+
}
|
|
29
|
+
var detail =
|
|
30
|
+
detailParts.length > 1
|
|
31
|
+
? detailParts.join(' · ')
|
|
32
|
+
: detailParts[0] || '';
|
|
33
|
+
var author =
|
|
34
|
+
it.authorLogin &&
|
|
35
|
+
'<div class="muted" style="font-size:0.8rem">@' +
|
|
36
|
+
esc(it.authorLogin) +
|
|
37
|
+
'</div>';
|
|
38
|
+
return (
|
|
39
|
+
'<tr>' +
|
|
40
|
+
'<td class="mono">' +
|
|
41
|
+
'<a href="' +
|
|
42
|
+
esc(it.prUrl) +
|
|
43
|
+
'" target="_blank" rel="noopener noreferrer">#' +
|
|
44
|
+
esc(it.prNumber) +
|
|
45
|
+
'</a>' +
|
|
46
|
+
'<div class="activity-pr-title muted">' +
|
|
47
|
+
esc(it.prTitle) +
|
|
48
|
+
'</div>' +
|
|
49
|
+
(author || '') +
|
|
50
|
+
'</td>' +
|
|
51
|
+
'<td class="mono wrap">' +
|
|
52
|
+
esc(it.githubRepo) +
|
|
53
|
+
'</td>' +
|
|
54
|
+
'<td>' +
|
|
55
|
+
esc(it.decisionLabel) +
|
|
56
|
+
'</td>' +
|
|
57
|
+
'<td class="wrap muted">' +
|
|
58
|
+
detail +
|
|
59
|
+
'</td>' +
|
|
60
|
+
'</tr>'
|
|
61
|
+
);
|
|
62
|
+
})
|
|
63
|
+
.join('');
|
|
64
|
+
return (
|
|
65
|
+
'<details class="activity-details">' +
|
|
66
|
+
'<summary class="activity-details-summary">PR details (' +
|
|
67
|
+
items.length +
|
|
68
|
+
')</summary>' +
|
|
69
|
+
'<div class="table-wrap activity-items-wrap">' +
|
|
70
|
+
'<table class="data-table activity-items-table">' +
|
|
71
|
+
'<thead><tr><th>PR</th><th>Repo</th><th>Outcome</th><th>Detail</th></tr></thead>' +
|
|
72
|
+
'<tbody>' +
|
|
73
|
+
rows +
|
|
74
|
+
'</tbody></table></div></details>'
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function renderRun(r) {
|
|
79
|
+
var meta =
|
|
80
|
+
'<div class="activity-run-meta">' +
|
|
81
|
+
'<span class="activity-run-time mono">' +
|
|
82
|
+
esc(r.startedAtLabel || fmtIso(r.startedAt)) +
|
|
83
|
+
'</span>' +
|
|
84
|
+
'<span class="activity-pill activity-pill-trigger">' +
|
|
85
|
+
esc(r.trigger) +
|
|
86
|
+
'</span>' +
|
|
87
|
+
'<span class="activity-pill activity-pill-phase activity-pill-phase-' +
|
|
88
|
+
esc(r.phase) +
|
|
89
|
+
'">' +
|
|
90
|
+
esc(r.phaseLabel) +
|
|
91
|
+
'</span></div>';
|
|
92
|
+
|
|
93
|
+
var summaryBody = '';
|
|
94
|
+
if (r.phase === 'running') {
|
|
95
|
+
summaryBody +=
|
|
96
|
+
'<p class="muted activity-run-counts" style="margin:0.35rem 0 0">Sync in progress… ' +
|
|
97
|
+
(r.itemCount || 0) +
|
|
98
|
+
' PR row(s) recorded so far.</p>';
|
|
99
|
+
}
|
|
100
|
+
if (r.phase === 'completed') {
|
|
101
|
+
summaryBody +=
|
|
102
|
+
'<p class="muted activity-run-counts" style="margin:0.35rem 0 0">' +
|
|
103
|
+
fmtCount(r.candidatesCount) +
|
|
104
|
+
' PR(s) seen · ' +
|
|
105
|
+
fmtCount(r.issuesCreated) +
|
|
106
|
+
' created · ' +
|
|
107
|
+
fmtCount(r.skippedUnmapped) +
|
|
108
|
+
' unmapped · ' +
|
|
109
|
+
fmtCount(r.skippedBot) +
|
|
110
|
+
' bot · ' +
|
|
111
|
+
fmtCount(r.skippedBoardLimit) +
|
|
112
|
+
' board limit · ' +
|
|
113
|
+
fmtCount(r.skippedAlreadyTracked) +
|
|
114
|
+
' already tracked · ' +
|
|
115
|
+
fmtCount(r.skippedLinkedExisting) +
|
|
116
|
+
' linked existing</p>';
|
|
117
|
+
}
|
|
118
|
+
if (r.phase === 'aborted') {
|
|
119
|
+
summaryBody +=
|
|
120
|
+
'<p class="muted activity-run-msg" style="margin:0.35rem 0 0">' +
|
|
121
|
+
(r.abortReason
|
|
122
|
+
? '<code class="mono">' + esc(r.abortReason) + '</code>'
|
|
123
|
+
: 'Aborted') +
|
|
124
|
+
'</p>';
|
|
125
|
+
}
|
|
126
|
+
if (r.phase === 'failed') {
|
|
127
|
+
summaryBody +=
|
|
128
|
+
'<p class="banner banner-error activity-run-msg" style="margin:0.5rem 0 0">' +
|
|
129
|
+
esc(r.errorMessage || 'Sync failed') +
|
|
130
|
+
'</p>';
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
var details = r.itemCount ? renderItemsTable(r.items) : '';
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
'<div class="card activity-run">' +
|
|
137
|
+
'<div class="activity-run-summary">' +
|
|
138
|
+
meta +
|
|
139
|
+
summaryBody +
|
|
140
|
+
'</div>' +
|
|
141
|
+
details +
|
|
142
|
+
'</div>'
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function renderRuns(runs) {
|
|
147
|
+
if (!runs || !runs.length) {
|
|
148
|
+
return (
|
|
149
|
+
'<div class="card activity-empty-card">' +
|
|
150
|
+
'<p class="muted" style="margin:0">No sync runs recorded yet. Runs appear when a sync starts.</p>' +
|
|
151
|
+
'</div>'
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
return runs.map(renderRun).join('');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
var pollTimer = null;
|
|
158
|
+
var pollWanted = false;
|
|
159
|
+
|
|
160
|
+
function anyRunning(runs) {
|
|
161
|
+
if (!runs || !runs.length) return false;
|
|
162
|
+
for (var i = 0; i < runs.length; i++) {
|
|
163
|
+
if (runs[i].phase === 'running') return true;
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function stopPoll() {
|
|
169
|
+
if (pollTimer != null) {
|
|
170
|
+
clearInterval(pollTimer);
|
|
171
|
+
pollTimer = null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function startPollInterval() {
|
|
176
|
+
stopPoll();
|
|
177
|
+
if (!pollWanted || document.visibilityState !== 'visible') return;
|
|
178
|
+
pollTimer = window.setInterval(function () {
|
|
179
|
+
void load();
|
|
180
|
+
}, POLL_WHILE_RUNNING_MS);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
document.addEventListener('visibilitychange', function () {
|
|
184
|
+
if (document.visibilityState === 'hidden') {
|
|
185
|
+
stopPoll();
|
|
186
|
+
} else if (pollWanted) {
|
|
187
|
+
void load();
|
|
188
|
+
startPollInterval();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
function schedulePollIfNeeded(runs) {
|
|
193
|
+
pollWanted = anyRunning(runs);
|
|
194
|
+
if (!pollWanted) {
|
|
195
|
+
stopPoll();
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
startPollInterval();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function load() {
|
|
202
|
+
try {
|
|
203
|
+
var res = await fetch('/api/activity/runs');
|
|
204
|
+
var text = await res.text();
|
|
205
|
+
if (!res.ok) throw new Error('HTTP ' + res.status);
|
|
206
|
+
var data = text ? JSON.parse(text) : { runs: [] };
|
|
207
|
+
var runs = data.runs || [];
|
|
208
|
+
root.innerHTML = renderRuns(runs);
|
|
209
|
+
schedulePollIfNeeded(runs);
|
|
210
|
+
} catch {
|
|
211
|
+
root.innerHTML =
|
|
212
|
+
'<div class="card"><p class="muted" style="margin:0">Could not load activity. Try refreshing the page.</p></div>';
|
|
213
|
+
stopPoll();
|
|
214
|
+
pollWanted = false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
Ui.onStatusSnapshot(function () {
|
|
219
|
+
void load();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
void load();
|
|
223
|
+
})();
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
const Ui = window.VibeSquireUi;
|
|
3
|
+
if (!Ui) return;
|
|
4
|
+
|
|
5
|
+
const pre = document.getElementById('status-snap');
|
|
6
|
+
const overview = document.getElementById('status-overview');
|
|
7
|
+
const bootEl = document.getElementById('boot-snapshot');
|
|
8
|
+
const msgEl = document.getElementById('action-msg');
|
|
9
|
+
const btnSync = document.getElementById('btn-sync');
|
|
10
|
+
const btnReinit = document.getElementById('btn-reinit');
|
|
11
|
+
|
|
12
|
+
const POLL_MS = 5 * 60 * 1000;
|
|
13
|
+
const esc = Ui.esc;
|
|
14
|
+
const fmtIso = Ui.fmtIso;
|
|
15
|
+
|
|
16
|
+
var reasonMap = {};
|
|
17
|
+
try {
|
|
18
|
+
var el = document.getElementById('setup-reasons');
|
|
19
|
+
if (el && el.textContent) reasonMap = JSON.parse(el.textContent);
|
|
20
|
+
} catch { /* embedded map unavailable — fall through to reason code */ }
|
|
21
|
+
|
|
22
|
+
function setupReasonHuman(reason) {
|
|
23
|
+
if (!reason) return 'Incomplete setup.';
|
|
24
|
+
return reasonMap[reason] || String(reason);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function ghHuman(state, message) {
|
|
28
|
+
if (state === 'ok') return 'Authenticated and ready.';
|
|
29
|
+
if (state === 'error') {
|
|
30
|
+
return message && String(message).trim()
|
|
31
|
+
? String(message)
|
|
32
|
+
: 'GitHub CLI error — check `gh` output.';
|
|
33
|
+
}
|
|
34
|
+
if (state === 'unknown') return 'GitHub CLI status unknown.';
|
|
35
|
+
return String(state);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function destHuman(d) {
|
|
39
|
+
const m = {
|
|
40
|
+
ok: 'Reachable.',
|
|
41
|
+
degraded: 'Degraded — some calls may fail.',
|
|
42
|
+
error: 'Error — check MCP stdio command and server.',
|
|
43
|
+
unknown: 'Not probed yet.',
|
|
44
|
+
};
|
|
45
|
+
return m[d.state] || String(d.state);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Show Reinit when DB, gh, destination, or scout looks unhealthy (not mere setup skip). */
|
|
49
|
+
function needsReinit(snap) {
|
|
50
|
+
if (!snap || typeof snap !== 'object') return false;
|
|
51
|
+
const db = snap.database || {};
|
|
52
|
+
if (db.state === 'error') return true;
|
|
53
|
+
const gh = snap.gh || {};
|
|
54
|
+
if (gh.state && gh.state !== 'ok') return true;
|
|
55
|
+
const dest = (snap.destinations && snap.destinations[0]) || {};
|
|
56
|
+
if (dest.state === 'degraded' || dest.state === 'error') return true;
|
|
57
|
+
const scout = snap.scouts && snap.scouts[0];
|
|
58
|
+
if (scout && scout.state === 'error') return true;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function card(title, dotClass, lines) {
|
|
63
|
+
const body = (lines || [])
|
|
64
|
+
.filter(Boolean)
|
|
65
|
+
.map((l) => '<p>' + esc(l) + '</p>')
|
|
66
|
+
.join('');
|
|
67
|
+
return (
|
|
68
|
+
'<div class="status-card">' +
|
|
69
|
+
'<div class="status-card-head">' +
|
|
70
|
+
'<span class="status-dot ' +
|
|
71
|
+
esc(dotClass) +
|
|
72
|
+
'" aria-hidden="true"></span>' +
|
|
73
|
+
'<h3>' +
|
|
74
|
+
esc(title) +
|
|
75
|
+
'</h3></div>' +
|
|
76
|
+
'<div class="status-card-body">' +
|
|
77
|
+
body +
|
|
78
|
+
'</div></div>'
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function renderOverview(snap) {
|
|
83
|
+
if (!overview || !snap) return;
|
|
84
|
+
const parts = [];
|
|
85
|
+
|
|
86
|
+
const gh = snap.gh || {};
|
|
87
|
+
let ghDot = 'status-neutral';
|
|
88
|
+
if (gh.state === 'ok') ghDot = 'status-ok';
|
|
89
|
+
else if (gh.state === 'error') ghDot = 'status-err';
|
|
90
|
+
else ghDot = 'status-warn';
|
|
91
|
+
const ghLines = [ghHuman(gh.state, gh.message)];
|
|
92
|
+
parts.push(card('GitHub CLI', ghDot, ghLines));
|
|
93
|
+
|
|
94
|
+
const db = snap.database || {};
|
|
95
|
+
const dbDot = db.state === 'ok' ? 'status-ok' : 'status-err';
|
|
96
|
+
const dbLines = [
|
|
97
|
+
db.state === 'ok' ? 'Database connected.' : 'Database error.',
|
|
98
|
+
];
|
|
99
|
+
if (db.message) dbLines.push(db.message);
|
|
100
|
+
parts.push(card('Database', dbDot, dbLines));
|
|
101
|
+
|
|
102
|
+
const setup = snap.setup || {};
|
|
103
|
+
const setupDot = setup.complete ? 'status-ok' : 'status-warn';
|
|
104
|
+
const cfg = snap.configuration || {};
|
|
105
|
+
const setupLines = setup.complete
|
|
106
|
+
? [
|
|
107
|
+
'Setup complete (sync allowed).',
|
|
108
|
+
'PR source: ' + String(cfg.source_type ?? '—'),
|
|
109
|
+
'Board: ' + String(cfg.destination_type ?? '—'),
|
|
110
|
+
'Mappings: ' + String(setup.mappingCount ?? 0),
|
|
111
|
+
]
|
|
112
|
+
: [
|
|
113
|
+
'Finish MCP and routing (see checklist on dashboard).',
|
|
114
|
+
setupReasonHuman(setup.reason),
|
|
115
|
+
];
|
|
116
|
+
parts.push(card('Setup', setupDot, setupLines));
|
|
117
|
+
|
|
118
|
+
const dest = (snap.destinations && snap.destinations[0]) || {};
|
|
119
|
+
let destDot = 'status-neutral';
|
|
120
|
+
if (dest.state === 'ok') destDot = 'status-ok';
|
|
121
|
+
else if (dest.state === 'degraded') destDot = 'status-warn';
|
|
122
|
+
else if (dest.state === 'error') destDot = 'status-err';
|
|
123
|
+
const destLines = ['Vibe Kanban (MCP).', destHuman(dest)];
|
|
124
|
+
if (dest.message) destLines.push(dest.message);
|
|
125
|
+
if (dest.lastOkAt) destLines.push('Last OK: ' + fmtIso(dest.lastOkAt));
|
|
126
|
+
parts.push(card('Destination', destDot, destLines));
|
|
127
|
+
|
|
128
|
+
const scout = snap.scouts && snap.scouts[0];
|
|
129
|
+
if (scout) {
|
|
130
|
+
let scDot = 'status-neutral';
|
|
131
|
+
if (scout.state === 'running') scDot = 'status-warn';
|
|
132
|
+
else if (scout.state === 'error') scDot = 'status-err';
|
|
133
|
+
else if (scout.state === 'skipped') scDot = 'status-warn';
|
|
134
|
+
else scDot = 'status-ok';
|
|
135
|
+
const scLines = [];
|
|
136
|
+
const sched = snap.scheduled_sync || {};
|
|
137
|
+
if (sched.enabled === false) {
|
|
138
|
+
scLines.push(
|
|
139
|
+
'Automatic polling is disabled — enable scheduled_sync_enabled in General settings (or SCHEDULED_SYNC_ENABLED).',
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if (scout.state === 'running') {
|
|
143
|
+
scLines.push('Sync cycle running…');
|
|
144
|
+
} else {
|
|
145
|
+
scLines.push('GitHub PR scout: ' + String(scout.state));
|
|
146
|
+
}
|
|
147
|
+
if (scout.skipReason) {
|
|
148
|
+
scLines.push('Reason: ' + String(scout.skipReason));
|
|
149
|
+
}
|
|
150
|
+
if (scout.lastError && scout.state === 'error') {
|
|
151
|
+
scLines.push(String(scout.lastError));
|
|
152
|
+
}
|
|
153
|
+
const lp = scout.last_poll || {};
|
|
154
|
+
if (
|
|
155
|
+
lp.candidates_count != null ||
|
|
156
|
+
lp.skipped_unmapped != null ||
|
|
157
|
+
lp.issues_created != null
|
|
158
|
+
) {
|
|
159
|
+
scLines.push(
|
|
160
|
+
'Last run: ' +
|
|
161
|
+
(lp.candidates_count ?? '—') +
|
|
162
|
+
' PR(s), ' +
|
|
163
|
+
(lp.issues_created ?? '—') +
|
|
164
|
+
' created, ' +
|
|
165
|
+
(lp.skipped_unmapped ?? '—') +
|
|
166
|
+
' skipped (unmapped)',
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
scLines.push('Last poll: ' + fmtIso(scout.lastPollAt));
|
|
170
|
+
if (sched.enabled === false) {
|
|
171
|
+
scLines.push('Next scheduled: — (timer off)');
|
|
172
|
+
} else {
|
|
173
|
+
scLines.push('Next scheduled: ' + fmtIso(scout.nextPollAt));
|
|
174
|
+
}
|
|
175
|
+
parts.push(card('Sync & scout', scDot, scLines));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const ms = snap.manual_sync || {};
|
|
179
|
+
let manDot = 'status-ok';
|
|
180
|
+
if (ms.canRun === false) manDot = 'status-warn';
|
|
181
|
+
const manLines = [];
|
|
182
|
+
if (ms.canRun !== false) {
|
|
183
|
+
manLines.push('You can run “Sync now” anytime (respects cooldown after a run).');
|
|
184
|
+
} else if (ms.reason === 'cooldown' && ms.cooldownUntil) {
|
|
185
|
+
manLines.push('Manual sync on cooldown until ' + fmtIso(ms.cooldownUntil));
|
|
186
|
+
} else if (ms.reason === 'already_running') {
|
|
187
|
+
manDot = 'status-warn';
|
|
188
|
+
manLines.push('Wait — a sync cycle is already running.');
|
|
189
|
+
} else {
|
|
190
|
+
manLines.push('Manual sync unavailable: ' + String(ms.reason || 'unknown'));
|
|
191
|
+
}
|
|
192
|
+
parts.push(card('Manual sync', manDot, manLines));
|
|
193
|
+
|
|
194
|
+
overview.innerHTML = parts.join('');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function setMsg(t) {
|
|
198
|
+
if (!msgEl) return;
|
|
199
|
+
msgEl.textContent = t || '';
|
|
200
|
+
msgEl.style.display = t ? 'block' : 'none';
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function renderManual(m) {
|
|
204
|
+
if (!m || !btnSync) return;
|
|
205
|
+
btnSync.disabled = m.canRun === false;
|
|
206
|
+
btnSync.title =
|
|
207
|
+
m.reason === 'cooldown' && m.cooldownUntil
|
|
208
|
+
? 'Cooldown until ' + m.cooldownUntil
|
|
209
|
+
: 'Run one full sync cycle now (same as the scheduler, but immediate)';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function applySnapshot(snap) {
|
|
213
|
+
if (!snap) return;
|
|
214
|
+
renderOverview(snap);
|
|
215
|
+
if (pre) pre.textContent = JSON.stringify(snap, null, 2);
|
|
216
|
+
renderManual(snap.manual_sync);
|
|
217
|
+
if (btnReinit) {
|
|
218
|
+
btnReinit.style.display = needsReinit(snap) ? '' : 'none';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function readBoot() {
|
|
223
|
+
if (!bootEl || !bootEl.textContent.trim()) return null;
|
|
224
|
+
try {
|
|
225
|
+
return JSON.parse(bootEl.textContent);
|
|
226
|
+
} catch {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async function load() {
|
|
232
|
+
try {
|
|
233
|
+
const res = await fetch('/api/status');
|
|
234
|
+
const text = await res.text();
|
|
235
|
+
const snap = text ? JSON.parse(text) : null;
|
|
236
|
+
if (!res.ok) throw new Error('HTTP ' + res.status);
|
|
237
|
+
applySnapshot(snap);
|
|
238
|
+
setMsg('');
|
|
239
|
+
} catch (e) {
|
|
240
|
+
const err = e instanceof Error ? e.message : String(e);
|
|
241
|
+
if (pre) pre.textContent = 'Error: ' + err;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const boot = readBoot();
|
|
246
|
+
if (boot) applySnapshot(boot);
|
|
247
|
+
|
|
248
|
+
try {
|
|
249
|
+
const w = window;
|
|
250
|
+
if (w.__VS_STATUS_SNAPSHOT__) {
|
|
251
|
+
applySnapshot(w.__VS_STATUS_SNAPSHOT__);
|
|
252
|
+
}
|
|
253
|
+
} catch {
|
|
254
|
+
/* ignore */
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
Ui.onStatusSnapshot((snap) => applySnapshot(snap));
|
|
258
|
+
|
|
259
|
+
window.setInterval(() => void load(), POLL_MS);
|
|
260
|
+
void load();
|
|
261
|
+
|
|
262
|
+
btnSync?.addEventListener('click', async () => {
|
|
263
|
+
setMsg('');
|
|
264
|
+
const res = await fetch('/api/sync/run', { method: 'POST' });
|
|
265
|
+
const text = await res.text();
|
|
266
|
+
if (res.status === 429) {
|
|
267
|
+
try {
|
|
268
|
+
const j = JSON.parse(text);
|
|
269
|
+
setMsg('Cooldown — try after ' + (j.cooldownUntil || 'later'));
|
|
270
|
+
} catch {
|
|
271
|
+
setMsg('Cooldown');
|
|
272
|
+
}
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (!res.ok) {
|
|
276
|
+
setMsg(text || 'HTTP ' + res.status);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
setMsg('Sync finished.');
|
|
280
|
+
void load();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
btnReinit?.addEventListener('click', async () => {
|
|
284
|
+
if (!confirm('Run soft reinit? This resets scout backoff flags.')) return;
|
|
285
|
+
setMsg('');
|
|
286
|
+
const res = await fetch('/api/reinit', { method: 'POST' });
|
|
287
|
+
const text = await res.text();
|
|
288
|
+
if (!res.ok) {
|
|
289
|
+
setMsg(text || 'HTTP ' + res.status);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
setMsg('Reinit completed.');
|
|
293
|
+
void load();
|
|
294
|
+
});
|
|
295
|
+
})();
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
const form = document.getElementById('new-mapping-form');
|
|
3
|
+
const repoSel = document.getElementById('mk-repo');
|
|
4
|
+
const hVkRepo = document.getElementById('h-vk-repo');
|
|
5
|
+
const mkErr = document.getElementById('mk-err');
|
|
6
|
+
function setMkErr(t) {
|
|
7
|
+
if (!mkErr) return;
|
|
8
|
+
mkErr.textContent = t || '';
|
|
9
|
+
mkErr.style.display = t ? 'block' : 'none';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (form && repoSel && hVkRepo) {
|
|
13
|
+
async function loadRepos() {
|
|
14
|
+
repoSel.innerHTML = '<option value="">Loading…</option>';
|
|
15
|
+
hVkRepo.value = '';
|
|
16
|
+
setMkErr('');
|
|
17
|
+
try {
|
|
18
|
+
const res = await fetch('/api/vibe-kanban/repos');
|
|
19
|
+
const data = await res.json().catch(() => ({}));
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
const msg =
|
|
22
|
+
typeof data.message === 'string'
|
|
23
|
+
? data.message
|
|
24
|
+
: 'Could not load repositories (' + res.status + ').';
|
|
25
|
+
setMkErr(msg);
|
|
26
|
+
repoSel.innerHTML = '<option value="">—</option>';
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const repos = data.repos || [];
|
|
30
|
+
repoSel.innerHTML =
|
|
31
|
+
'<option value="">Select Vibe Kanban repository…</option>';
|
|
32
|
+
for (const r of repos) {
|
|
33
|
+
const opt = document.createElement('option');
|
|
34
|
+
opt.value = r.id;
|
|
35
|
+
opt.textContent = r.name ? r.name + ' — ' + r.id : r.id;
|
|
36
|
+
repoSel.appendChild(opt);
|
|
37
|
+
}
|
|
38
|
+
if (!repos.length) {
|
|
39
|
+
setMkErr('No repositories returned from MCP.');
|
|
40
|
+
}
|
|
41
|
+
} catch (e) {
|
|
42
|
+
setMkErr(e instanceof Error ? e.message : String(e));
|
|
43
|
+
repoSel.innerHTML = '<option value="">—</option>';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
repoSel.addEventListener('change', () => {
|
|
48
|
+
hVkRepo.value = repoSel.value.trim();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
form.addEventListener('submit', (e) => {
|
|
52
|
+
if (!hVkRepo.value.trim()) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
alert('Choose a Vibe Kanban repository from the list.');
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
void loadRepos();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function wireRow(row) {
|
|
62
|
+
const id = row.getAttribute('data-id');
|
|
63
|
+
if (!id) return;
|
|
64
|
+
const editBtn = row.querySelector('.js-edit');
|
|
65
|
+
const saveBtn = row.querySelector('.js-save');
|
|
66
|
+
const cancelBtn = row.querySelector('.js-cancel');
|
|
67
|
+
const inputs = row.querySelectorAll('input.edit');
|
|
68
|
+
|
|
69
|
+
editBtn?.addEventListener('click', () => {
|
|
70
|
+
row.classList.add('is-editing');
|
|
71
|
+
});
|
|
72
|
+
cancelBtn?.addEventListener('click', () => {
|
|
73
|
+
location.reload();
|
|
74
|
+
});
|
|
75
|
+
saveBtn?.addEventListener('click', async () => {
|
|
76
|
+
if (inputs.length < 3) return;
|
|
77
|
+
const body = {
|
|
78
|
+
githubRepo: inputs[0].value.trim(),
|
|
79
|
+
vibeKanbanRepoId: inputs[1].value.trim(),
|
|
80
|
+
label: inputs[2].value.trim() || undefined,
|
|
81
|
+
};
|
|
82
|
+
const res = await fetch('/api/mappings/' + encodeURIComponent(id), {
|
|
83
|
+
method: 'PATCH',
|
|
84
|
+
headers: { 'Content-Type': 'application/json' },
|
|
85
|
+
body: JSON.stringify(body),
|
|
86
|
+
});
|
|
87
|
+
if (!res.ok) {
|
|
88
|
+
const t = await res.text();
|
|
89
|
+
alert(t || 'HTTP ' + res.status);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
location.reload();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
document.querySelectorAll('.js-mapping-row').forEach(wireRow);
|
|
97
|
+
})();
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
var g = window;
|
|
3
|
+
var VS = g.VibeSquireUi || {};
|
|
4
|
+
var SSE_EVENT =
|
|
5
|
+
VS.STATUS_SNAPSHOT_EVENT || g.__VS_SSE_EVENT__ || 'vibesquire:status-snapshot';
|
|
6
|
+
var stateEl = document.getElementById('nav-sse-state');
|
|
7
|
+
|
|
8
|
+
function setSse(s) {
|
|
9
|
+
if (!stateEl) return;
|
|
10
|
+
stateEl.textContent = s;
|
|
11
|
+
stateEl.className = 'sse sse-' + s;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function publishSnapshot(snap) {
|
|
15
|
+
if (!snap || typeof snap !== 'object') return;
|
|
16
|
+
try {
|
|
17
|
+
g.__VS_STATUS_SNAPSHOT__ = snap;
|
|
18
|
+
} catch {
|
|
19
|
+
/* ignore */
|
|
20
|
+
}
|
|
21
|
+
g.dispatchEvent(new CustomEvent(SSE_EVENT, { detail: snap }));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var es = new EventSource('/api/status/stream');
|
|
25
|
+
setSse('connecting');
|
|
26
|
+
es.onopen = function () {
|
|
27
|
+
setSse('open');
|
|
28
|
+
};
|
|
29
|
+
es.onerror = function () {
|
|
30
|
+
setSse('closed');
|
|
31
|
+
};
|
|
32
|
+
es.onmessage = function (ev) {
|
|
33
|
+
if (!ev.data || !String(ev.data).trim()) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
var snap = JSON.parse(ev.data);
|
|
38
|
+
publishSnapshot(snap);
|
|
39
|
+
} catch {
|
|
40
|
+
/* ignore */
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
(function (g) {
|
|
2
|
+
var VS = (g.VibeSquireUi = g.VibeSquireUi || {});
|
|
3
|
+
|
|
4
|
+
VS.STATUS_SNAPSHOT_EVENT = 'vibesquire:status-snapshot';
|
|
5
|
+
g.__VS_SSE_EVENT__ = VS.STATUS_SNAPSHOT_EVENT;
|
|
6
|
+
|
|
7
|
+
VS.esc = function (s) {
|
|
8
|
+
if (s == null || s === undefined) return '';
|
|
9
|
+
return String(s)
|
|
10
|
+
.replace(/&/g, '&')
|
|
11
|
+
.replace(/</g, '<')
|
|
12
|
+
.replace(/>/g, '>')
|
|
13
|
+
.replace(/"/g, '"');
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
VS.fmtIso = function (iso) {
|
|
17
|
+
if (!iso) return '—';
|
|
18
|
+
try {
|
|
19
|
+
var d = new Date(iso);
|
|
20
|
+
return Number.isNaN(d.getTime()) ? String(iso) : d.toLocaleString();
|
|
21
|
+
} catch {
|
|
22
|
+
return String(iso);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Subscribe to status snapshots dispatched by operator-shell (SSE).
|
|
28
|
+
* @param {(snap: object) => void} callback
|
|
29
|
+
* @returns {() => void} unsubscribe
|
|
30
|
+
*/
|
|
31
|
+
VS.onStatusSnapshot = function (callback) {
|
|
32
|
+
var handler = function (ev) {
|
|
33
|
+
if (ev && ev.detail) callback(ev.detail);
|
|
34
|
+
};
|
|
35
|
+
g.addEventListener(VS.STATUS_SNAPSHOT_EVENT, handler);
|
|
36
|
+
return function () {
|
|
37
|
+
g.removeEventListener(VS.STATUS_SNAPSHOT_EVENT, handler);
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
})(window);
|