runwork 0.15.0 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +19272 -116
- package/package.json +4 -4
- package/dist/__tests__/curl-parser.test.d.ts +0 -1
- package/dist/__tests__/curl-parser.test.js +0 -250
- package/dist/__tests__/install-scripts.test.d.ts +0 -1
- package/dist/__tests__/install-scripts.test.js +0 -280
- package/dist/__tests__/types-manager.test.d.ts +0 -1
- package/dist/__tests__/types-manager.test.js +0 -89
- package/dist/agents/__tests__/chatgpt-registry.test.d.ts +0 -1
- package/dist/agents/__tests__/chatgpt-registry.test.js +0 -61
- package/dist/agents/__tests__/claude-code-managed-block.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-code-managed-block.test.js +0 -97
- package/dist/agents/__tests__/claude-code-plugin.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-code-plugin.test.js +0 -47
- package/dist/agents/__tests__/claude-code-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-code-stats.test.js +0 -390
- package/dist/agents/__tests__/claude-desktop-memory.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-memory.test.js +0 -154
- package/dist/agents/__tests__/claude-desktop-plugin-tree.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-plugin-tree.test.js +0 -161
- package/dist/agents/__tests__/claude-desktop-plugin.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-plugin.test.js +0 -117
- package/dist/agents/__tests__/claude-desktop-rpm.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-rpm.test.js +0 -126
- package/dist/agents/__tests__/claude-desktop-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-stats.test.js +0 -280
- package/dist/agents/__tests__/codex-instructions.test.d.ts +0 -1
- package/dist/agents/__tests__/codex-instructions.test.js +0 -57
- package/dist/agents/__tests__/codex-minimum-permissions.test.d.ts +0 -1
- package/dist/agents/__tests__/codex-minimum-permissions.test.js +0 -82
- package/dist/agents/__tests__/codex-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/codex-stats.test.js +0 -370
- package/dist/agents/__tests__/cursor-merge.test.d.ts +0 -1
- package/dist/agents/__tests__/cursor-merge.test.js +0 -66
- package/dist/agents/__tests__/cursor-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/cursor-stats.test.js +0 -183
- package/dist/agents/__tests__/defaults-merge.test.d.ts +0 -1
- package/dist/agents/__tests__/defaults-merge.test.js +0 -268
- package/dist/agents/__tests__/detection.test.d.ts +0 -1
- package/dist/agents/__tests__/detection.test.js +0 -89
- package/dist/agents/__tests__/graceful-degradation.test.d.ts +0 -1
- package/dist/agents/__tests__/graceful-degradation.test.js +0 -129
- package/dist/agents/__tests__/instruction-hint.test.d.ts +0 -1
- package/dist/agents/__tests__/instruction-hint.test.js +0 -69
- package/dist/agents/__tests__/intro-skill.test.d.ts +0 -1
- package/dist/agents/__tests__/intro-skill.test.js +0 -193
- package/dist/agents/__tests__/schema-validation.test.d.ts +0 -1
- package/dist/agents/__tests__/schema-validation.test.js +0 -212
- package/dist/agents/__tests__/skill-slug.test.d.ts +0 -1
- package/dist/agents/__tests__/skill-slug.test.js +0 -77
- package/dist/agents/claude-code.d.ts +0 -53
- package/dist/agents/claude-code.js +0 -754
- package/dist/agents/claude-desktop-plugin-tree.d.ts +0 -59
- package/dist/agents/claude-desktop-plugin-tree.js +0 -143
- package/dist/agents/claude-desktop.d.ts +0 -47
- package/dist/agents/claude-desktop.js +0 -684
- package/dist/agents/cline.d.ts +0 -15
- package/dist/agents/cline.js +0 -130
- package/dist/agents/codex.d.ts +0 -44
- package/dist/agents/codex.js +0 -453
- package/dist/agents/conversation-skills.d.ts +0 -18
- package/dist/agents/conversation-skills.js +0 -229
- package/dist/agents/cursor.d.ts +0 -48
- package/dist/agents/cursor.js +0 -324
- package/dist/agents/default-config.d.ts +0 -30
- package/dist/agents/default-config.js +0 -67
- package/dist/agents/defaults-merge.d.ts +0 -72
- package/dist/agents/defaults-merge.js +0 -131
- package/dist/agents/detect.d.ts +0 -4
- package/dist/agents/detect.js +0 -67
- package/dist/agents/detection.d.ts +0 -18
- package/dist/agents/detection.js +0 -94
- package/dist/agents/gemini.d.ts +0 -15
- package/dist/agents/gemini.js +0 -122
- package/dist/agents/generic-adapter.d.ts +0 -25
- package/dist/agents/generic-adapter.js +0 -151
- package/dist/agents/intro-skill.d.ts +0 -45
- package/dist/agents/intro-skill.js +0 -447
- package/dist/agents/registry-data.d.ts +0 -192
- package/dist/agents/registry-data.js +0 -669
- package/dist/agents/registry.d.ts +0 -13
- package/dist/agents/registry.js +0 -36
- package/dist/agents/runtime-detection.d.ts +0 -82
- package/dist/agents/runtime-detection.js +0 -271
- package/dist/agents/session-start-hook.d.ts +0 -37
- package/dist/agents/session-start-hook.js +0 -159
- package/dist/agents/types.d.ts +0 -171
- package/dist/agents/types.js +0 -75
- package/dist/agents/utils/instruction-hint.d.ts +0 -21
- package/dist/agents/utils/instruction-hint.js +0 -108
- package/dist/agents/utils/json-config.d.ts +0 -19
- package/dist/agents/utils/json-config.js +0 -69
- package/dist/agents/utils/toml-config.d.ts +0 -8
- package/dist/agents/utils/toml-config.js +0 -27
- package/dist/agents/windsurf.d.ts +0 -14
- package/dist/agents/windsurf.js +0 -102
- package/dist/api/__tests__/client.test.d.ts +0 -1
- package/dist/api/__tests__/client.test.js +0 -272
- package/dist/api/client.d.ts +0 -326
- package/dist/api/client.js +0 -427
- package/dist/auth/__tests__/login-flow.test.d.ts +0 -1
- package/dist/auth/__tests__/login-flow.test.js +0 -101
- package/dist/auth/__tests__/store.test.d.ts +0 -1
- package/dist/auth/__tests__/store.test.js +0 -132
- package/dist/auth/login-flow.d.ts +0 -26
- package/dist/auth/login-flow.js +0 -137
- package/dist/auth/store.d.ts +0 -5
- package/dist/auth/store.js +0 -62
- package/dist/commands/__tests__/clone-args.test.d.ts +0 -1
- package/dist/commands/__tests__/clone-args.test.js +0 -51
- package/dist/commands/__tests__/clone-source-result.test.d.ts +0 -1
- package/dist/commands/__tests__/clone-source-result.test.js +0 -45
- package/dist/commands/__tests__/info-merge.test.d.ts +0 -1
- package/dist/commands/__tests__/info-merge.test.js +0 -55
- package/dist/commands/__tests__/mcp-entries.test.d.ts +0 -1
- package/dist/commands/__tests__/mcp-entries.test.js +0 -48
- package/dist/commands/__tests__/setup-persona.test.d.ts +0 -1
- package/dist/commands/__tests__/setup-persona.test.js +0 -31
- package/dist/commands/__tests__/setup.test.d.ts +0 -1
- package/dist/commands/__tests__/setup.test.js +0 -81
- package/dist/commands/__tests__/sync-redetect.test.d.ts +0 -1
- package/dist/commands/__tests__/sync-redetect.test.js +0 -96
- package/dist/commands/__tests__/sync-telemetry.test.d.ts +0 -1
- package/dist/commands/__tests__/sync-telemetry.test.js +0 -281
- package/dist/commands/__tests__/upgrade.test.d.ts +0 -1
- package/dist/commands/__tests__/upgrade.test.js +0 -157
- package/dist/commands/agents.d.ts +0 -2
- package/dist/commands/agents.js +0 -160
- package/dist/commands/api-keys.d.ts +0 -2
- package/dist/commands/api-keys.js +0 -95
- package/dist/commands/apps.d.ts +0 -2
- package/dist/commands/apps.js +0 -82
- package/dist/commands/build-plugin.d.ts +0 -2
- package/dist/commands/build-plugin.js +0 -135
- package/dist/commands/clone.d.ts +0 -60
- package/dist/commands/clone.js +0 -271
- package/dist/commands/components.d.ts +0 -2
- package/dist/commands/components.js +0 -43
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.js +0 -279
- package/dist/commands/dev.d.ts +0 -11
- package/dist/commands/dev.js +0 -1011
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.js +0 -230
- package/dist/commands/endpoints.d.ts +0 -2
- package/dist/commands/endpoints.js +0 -189
- package/dist/commands/entities.d.ts +0 -2
- package/dist/commands/entities.js +0 -198
- package/dist/commands/files.d.ts +0 -2
- package/dist/commands/files.js +0 -193
- package/dist/commands/inbox.d.ts +0 -11
- package/dist/commands/inbox.js +0 -60
- package/dist/commands/info.d.ts +0 -178
- package/dist/commands/info.js +0 -455
- package/dist/commands/init.d.ts +0 -21
- package/dist/commands/init.js +0 -185
- package/dist/commands/integrations.d.ts +0 -2
- package/dist/commands/integrations.js +0 -233
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.js +0 -44
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -232
- package/dist/commands/mcp-entries.d.ts +0 -13
- package/dist/commands/mcp-entries.js +0 -26
- package/dist/commands/mcp.d.ts +0 -2
- package/dist/commands/mcp.js +0 -245
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -53
- package/dist/commands/resume.d.ts +0 -2
- package/dist/commands/resume.js +0 -289
- package/dist/commands/save-convo.d.ts +0 -8
- package/dist/commands/save-convo.js +0 -20
- package/dist/commands/schedules.d.ts +0 -2
- package/dist/commands/schedules.js +0 -221
- package/dist/commands/setup.d.ts +0 -27
- package/dist/commands/setup.js +0 -177
- package/dist/commands/share-convo.d.ts +0 -24
- package/dist/commands/share-convo.js +0 -167
- package/dist/commands/skills.d.ts +0 -2
- package/dist/commands/skills.js +0 -352
- package/dist/commands/sync-telemetry.d.ts +0 -33
- package/dist/commands/sync-telemetry.js +0 -186
- package/dist/commands/sync.d.ts +0 -37
- package/dist/commands/sync.js +0 -702
- package/dist/commands/uninstall.d.ts +0 -2
- package/dist/commands/uninstall.js +0 -145
- package/dist/commands/upgrade.d.ts +0 -14
- package/dist/commands/upgrade.js +0 -217
- package/dist/commands/validate.d.ts +0 -2
- package/dist/commands/validate.js +0 -89
- package/dist/commands/welcome.d.ts +0 -1
- package/dist/commands/welcome.js +0 -86
- package/dist/commands/workflows.d.ts +0 -2
- package/dist/commands/workflows.js +0 -187
- package/dist/deploy/__tests__/deploy-state.test.d.ts +0 -1
- package/dist/deploy/__tests__/deploy-state.test.js +0 -80
- package/dist/deploy/__tests__/deploy-status.test.d.ts +0 -1
- package/dist/deploy/__tests__/deploy-status.test.js +0 -41
- package/dist/deploy/__tests__/detach-args.test.d.ts +0 -1
- package/dist/deploy/__tests__/detach-args.test.js +0 -30
- package/dist/deploy/deploy-state.d.ts +0 -36
- package/dist/deploy/deploy-state.js +0 -63
- package/dist/deploy/deploy-status.d.ts +0 -21
- package/dist/deploy/deploy-status.js +0 -36
- package/dist/deploy/detach.d.ts +0 -32
- package/dist/deploy/detach.js +0 -71
- package/dist/dev/__tests__/attach.test.d.ts +0 -1
- package/dist/dev/__tests__/attach.test.js +0 -296
- package/dist/dev/__tests__/detach.test.d.ts +0 -1
- package/dist/dev/__tests__/detach.test.js +0 -404
- package/dist/dev/__tests__/preview-url-poller.test.d.ts +0 -1
- package/dist/dev/__tests__/preview-url-poller.test.js +0 -149
- package/dist/dev/__tests__/session.test.d.ts +0 -1
- package/dist/dev/__tests__/session.test.js +0 -446
- package/dist/dev/__tests__/startup-sync.test.d.ts +0 -1
- package/dist/dev/__tests__/startup-sync.test.js +0 -32
- package/dist/dev/__tests__/stop.test.d.ts +0 -1
- package/dist/dev/__tests__/stop.test.js +0 -172
- package/dist/dev/attach.d.ts +0 -120
- package/dist/dev/attach.js +0 -269
- package/dist/dev/detach.d.ts +0 -187
- package/dist/dev/detach.js +0 -292
- package/dist/dev/preview-url-poller.d.ts +0 -35
- package/dist/dev/preview-url-poller.js +0 -50
- package/dist/dev/session.d.ts +0 -175
- package/dist/dev/session.js +0 -258
- package/dist/dev/startup-sync.d.ts +0 -23
- package/dist/dev/startup-sync.js +0 -14
- package/dist/dev/stop.d.ts +0 -52
- package/dist/dev/stop.js +0 -101
- package/dist/devtools/registry-data.d.ts +0 -46
- package/dist/devtools/registry-data.js +0 -40
- package/dist/generated/bundled-types.d.ts +0 -1
- package/dist/generated/bundled-types.js +0 -46
- package/dist/generated/version.d.ts +0 -1
- package/dist/generated/version.js +0 -2
- package/dist/git/__tests__/auto-commit.test.d.ts +0 -1
- package/dist/git/__tests__/auto-commit.test.js +0 -431
- package/dist/git/__tests__/classify-sync-error.test.d.ts +0 -1
- package/dist/git/__tests__/classify-sync-error.test.js +0 -57
- package/dist/git/__tests__/credential-helper-e2e.test.d.ts +0 -21
- package/dist/git/__tests__/credential-helper-e2e.test.js +0 -195
- package/dist/git/__tests__/credentials.test.d.ts +0 -1
- package/dist/git/__tests__/credentials.test.js +0 -141
- package/dist/git/__tests__/deploy-guard.test.d.ts +0 -1
- package/dist/git/__tests__/deploy-guard.test.js +0 -61
- package/dist/git/__tests__/ensure-git-credential-helper.test.d.ts +0 -1
- package/dist/git/__tests__/ensure-git-credential-helper.test.js +0 -133
- package/dist/git/__tests__/ensure-runwork-remote.test.d.ts +0 -1
- package/dist/git/__tests__/ensure-runwork-remote.test.js +0 -109
- package/dist/git/__tests__/identity.test.d.ts +0 -1
- package/dist/git/__tests__/identity.test.js +0 -146
- package/dist/git/__tests__/manifest.test.d.ts +0 -1
- package/dist/git/__tests__/manifest.test.js +0 -446
- package/dist/git/__tests__/preflight-resolution.test.d.ts +0 -1
- package/dist/git/__tests__/preflight-resolution.test.js +0 -366
- package/dist/git/__tests__/preflight.test.d.ts +0 -1
- package/dist/git/__tests__/preflight.test.js +0 -36
- package/dist/git/__tests__/repo-config.test.d.ts +0 -1
- package/dist/git/__tests__/repo-config.test.js +0 -26
- package/dist/git/__tests__/sync.test.d.ts +0 -1
- package/dist/git/__tests__/sync.test.js +0 -405
- package/dist/git/auto-commit.d.ts +0 -35
- package/dist/git/auto-commit.js +0 -293
- package/dist/git/classify-sync-error.d.ts +0 -21
- package/dist/git/classify-sync-error.js +0 -111
- package/dist/git/credentials.d.ts +0 -75
- package/dist/git/credentials.js +0 -164
- package/dist/git/critical-files.d.ts +0 -20
- package/dist/git/critical-files.js +0 -68
- package/dist/git/deploy-guard.d.ts +0 -53
- package/dist/git/deploy-guard.js +0 -78
- package/dist/git/identity.d.ts +0 -44
- package/dist/git/identity.js +0 -133
- package/dist/git/preflight.d.ts +0 -57
- package/dist/git/preflight.js +0 -276
- package/dist/git/remote.d.ts +0 -37
- package/dist/git/remote.js +0 -75
- package/dist/git/repo-config.d.ts +0 -8
- package/dist/git/repo-config.js +0 -29
- package/dist/git/sync.d.ts +0 -15
- package/dist/git/sync.js +0 -159
- package/dist/health/__tests__/checks.test.d.ts +0 -1
- package/dist/health/__tests__/checks.test.js +0 -357
- package/dist/health/__tests__/cli-distribution-checks.test.d.ts +0 -1
- package/dist/health/__tests__/cli-distribution-checks.test.js +0 -196
- package/dist/health/__tests__/fix.test.d.ts +0 -1
- package/dist/health/__tests__/fix.test.js +0 -72
- package/dist/health/__tests__/runner-filter.test.d.ts +0 -1
- package/dist/health/__tests__/runner-filter.test.js +0 -61
- package/dist/health/checks.d.ts +0 -42
- package/dist/health/checks.js +0 -636
- package/dist/health/fix.d.ts +0 -22
- package/dist/health/fix.js +0 -62
- package/dist/health/runner.d.ts +0 -8
- package/dist/health/runner.js +0 -47
- package/dist/health/types.d.ts +0 -12
- package/dist/health/types.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/logs/__tests__/tailer-format.test.d.ts +0 -1
- package/dist/logs/__tests__/tailer-format.test.js +0 -43
- package/dist/logs/tailer.d.ts +0 -17
- package/dist/logs/tailer.js +0 -217
- package/dist/sync/__tests__/change-detect.test.d.ts +0 -1
- package/dist/sync/__tests__/change-detect.test.js +0 -123
- package/dist/sync/__tests__/hash.test.d.ts +0 -1
- package/dist/sync/__tests__/hash.test.js +0 -18
- package/dist/sync/change-detect.d.ts +0 -19
- package/dist/sync/change-detect.js +0 -136
- package/dist/sync/conflict-ui.d.ts +0 -5
- package/dist/sync/conflict-ui.js +0 -78
- package/dist/sync/executor.d.ts +0 -23
- package/dist/sync/executor.js +0 -102
- package/dist/sync/hash.d.ts +0 -1
- package/dist/sync/hash.js +0 -4
- package/dist/sync/types.d.ts +0 -24
- package/dist/sync/types.js +0 -1
- package/dist/template/manifest.d.ts +0 -17
- package/dist/template/manifest.js +0 -145
- package/dist/tools/types.d.ts +0 -52
- package/dist/tools/types.js +0 -8
- package/dist/types-manager.d.ts +0 -1
- package/dist/types-manager.js +0 -35
- package/dist/types.d.ts +0 -349
- package/dist/types.js +0 -1
- package/dist/ui/__tests__/banner.test.d.ts +0 -1
- package/dist/ui/__tests__/banner.test.js +0 -98
- package/dist/ui/__tests__/colors.test.d.ts +0 -1
- package/dist/ui/__tests__/colors.test.js +0 -22
- package/dist/ui/__tests__/keyboard.test.d.ts +0 -1
- package/dist/ui/__tests__/keyboard.test.js +0 -34
- package/dist/ui/__tests__/status-line.test.d.ts +0 -1
- package/dist/ui/__tests__/status-line.test.js +0 -54
- package/dist/ui/banner.d.ts +0 -29
- package/dist/ui/banner.js +0 -153
- package/dist/ui/colors.d.ts +0 -4
- package/dist/ui/colors.js +0 -7
- package/dist/ui/keyboard.d.ts +0 -12
- package/dist/ui/keyboard.js +0 -61
- package/dist/ui/status-line.d.ts +0 -6
- package/dist/ui/status-line.js +0 -53
- package/dist/utils/__tests__/format-error.test.d.ts +0 -1
- package/dist/utils/__tests__/format-error.test.js +0 -43
- package/dist/utils/__tests__/help-json.test.d.ts +0 -1
- package/dist/utils/__tests__/help-json.test.js +0 -39
- package/dist/utils/__tests__/http.test.d.ts +0 -1
- package/dist/utils/__tests__/http.test.js +0 -381
- package/dist/utils/__tests__/ignore-matcher.test.d.ts +0 -1
- package/dist/utils/__tests__/ignore-matcher.test.js +0 -205
- package/dist/utils/__tests__/output.test.d.ts +0 -1
- package/dist/utils/__tests__/output.test.js +0 -38
- package/dist/utils/__tests__/prompt.test.d.ts +0 -1
- package/dist/utils/__tests__/prompt.test.js +0 -27
- package/dist/utils/__tests__/resolve.test.d.ts +0 -1
- package/dist/utils/__tests__/resolve.test.js +0 -95
- package/dist/utils/__tests__/sqlite.test.d.ts +0 -1
- package/dist/utils/__tests__/sqlite.test.js +0 -89
- package/dist/utils/agent-guidance.d.ts +0 -47
- package/dist/utils/agent-guidance.js +0 -128
- package/dist/utils/app-info.d.ts +0 -70
- package/dist/utils/app-info.js +0 -167
- package/dist/utils/curl-parser.d.ts +0 -12
- package/dist/utils/curl-parser.js +0 -162
- package/dist/utils/data-input.d.ts +0 -1
- package/dist/utils/data-input.js +0 -38
- package/dist/utils/format-error.d.ts +0 -10
- package/dist/utils/format-error.js +0 -38
- package/dist/utils/fs.d.ts +0 -5
- package/dist/utils/fs.js +0 -23
- package/dist/utils/help-json.d.ts +0 -70
- package/dist/utils/help-json.js +0 -88
- package/dist/utils/http.d.ts +0 -46
- package/dist/utils/http.js +0 -421
- package/dist/utils/ignore-matcher.d.ts +0 -47
- package/dist/utils/ignore-matcher.js +0 -132
- package/dist/utils/output.d.ts +0 -17
- package/dist/utils/output.js +0 -27
- package/dist/utils/prompt.d.ts +0 -5
- package/dist/utils/prompt.js +0 -42
- package/dist/utils/resolve.d.ts +0 -12
- package/dist/utils/resolve.js +0 -52
- package/dist/utils/setup-state.d.ts +0 -3
- package/dist/utils/setup-state.js +0 -19
- package/dist/utils/sqlite-adapter.d.ts +0 -48
- package/dist/utils/sqlite-adapter.js +0 -147
- package/dist/utils/sqlite.d.ts +0 -14
- package/dist/utils/sqlite.js +0 -14
- package/dist/utils/subprocess.d.ts +0 -19
- package/dist/utils/subprocess.js +0 -27
- package/dist/utils/which.d.ts +0 -14
- package/dist/utils/which.js +0 -47
- package/dist/utils/zip.d.ts +0 -7
- package/dist/utils/zip.js +0 -42
- package/dist/validate/__tests__/validate.test.d.ts +0 -1
- package/dist/validate/__tests__/validate.test.js +0 -42
- package/dist/validate/freshness.d.ts +0 -28
- package/dist/validate/freshness.js +0 -48
- package/dist/validate/preview.d.ts +0 -21
- package/dist/validate/preview.js +0 -39
- package/dist/workspace/resolve.d.ts +0 -19
- package/dist/workspace/resolve.js +0 -100
package/dist/utils/prompt.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { select, text, confirm, isCancel } from '@clack/prompts';
|
|
2
|
-
export async function promptSelect(message, choices) {
|
|
3
|
-
if (choices.length === 0) {
|
|
4
|
-
throw new Error('No choices available');
|
|
5
|
-
}
|
|
6
|
-
if (choices.length === 1) {
|
|
7
|
-
console.log(`${message}: ${choices[0].label}`);
|
|
8
|
-
return choices[0];
|
|
9
|
-
}
|
|
10
|
-
const result = await select({
|
|
11
|
-
message,
|
|
12
|
-
options: choices.map((c, i) => ({
|
|
13
|
-
value: i,
|
|
14
|
-
label: c.label,
|
|
15
|
-
})),
|
|
16
|
-
});
|
|
17
|
-
if (isCancel(result)) {
|
|
18
|
-
console.log('Cancelled.');
|
|
19
|
-
process.exit(0);
|
|
20
|
-
}
|
|
21
|
-
return choices[result];
|
|
22
|
-
}
|
|
23
|
-
export async function promptInput(message, defaultValue) {
|
|
24
|
-
const result = await text({
|
|
25
|
-
message,
|
|
26
|
-
defaultValue,
|
|
27
|
-
placeholder: defaultValue,
|
|
28
|
-
});
|
|
29
|
-
if (isCancel(result)) {
|
|
30
|
-
console.log('Cancelled.');
|
|
31
|
-
process.exit(0);
|
|
32
|
-
}
|
|
33
|
-
return result.trim() || defaultValue || '';
|
|
34
|
-
}
|
|
35
|
-
export async function promptConfirm(message) {
|
|
36
|
-
const result = await confirm({ message });
|
|
37
|
-
if (isCancel(result)) {
|
|
38
|
-
console.log('Cancelled.');
|
|
39
|
-
process.exit(0);
|
|
40
|
-
}
|
|
41
|
-
return result;
|
|
42
|
-
}
|
package/dist/utils/resolve.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ApiClient } from '../api/client.js';
|
|
2
|
-
import type { AppInfo, WorkspaceInfo } from '../types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Resolve a workspace by name or ID from the user's accessible workspaces.
|
|
5
|
-
* Tries exact ID match first, then case-insensitive name match.
|
|
6
|
-
*/
|
|
7
|
-
export declare function resolveWorkspace(client: ApiClient, nameOrId: string): Promise<WorkspaceInfo>;
|
|
8
|
-
/**
|
|
9
|
-
* Resolve an app by name or ID from the user's accessible apps.
|
|
10
|
-
* Tries exact ID match first, then case-insensitive name match.
|
|
11
|
-
*/
|
|
12
|
-
export declare function resolveApp(client: ApiClient, nameOrId: string): Promise<AppInfo>;
|
package/dist/utils/resolve.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve a workspace by name or ID from the user's accessible workspaces.
|
|
3
|
-
* Tries exact ID match first, then case-insensitive name match.
|
|
4
|
-
*/
|
|
5
|
-
export async function resolveWorkspace(client, nameOrId) {
|
|
6
|
-
const workspaces = await client.listWorkspaces();
|
|
7
|
-
if (workspaces.length === 0) {
|
|
8
|
-
console.error('No workspaces found. Create one at runwork.ai first.');
|
|
9
|
-
process.exit(1);
|
|
10
|
-
}
|
|
11
|
-
// Exact ID match
|
|
12
|
-
const byId = workspaces.find(w => w.id === nameOrId);
|
|
13
|
-
if (byId)
|
|
14
|
-
return byId;
|
|
15
|
-
// Case-insensitive name match
|
|
16
|
-
const lower = nameOrId.toLowerCase();
|
|
17
|
-
const byName = workspaces.filter(w => w.name.toLowerCase() === lower);
|
|
18
|
-
if (byName.length === 1)
|
|
19
|
-
return byName[0];
|
|
20
|
-
if (byName.length > 1) {
|
|
21
|
-
console.error(`Ambiguous workspace name "${nameOrId}". Matches: ${byName.map(w => `${w.name} (${w.id})`).join(', ')}`);
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
console.error(`Workspace "${nameOrId}" not found. Available: ${workspaces.map(w => w.name).join(', ')}`);
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Resolve an app by name or ID from the user's accessible apps.
|
|
29
|
-
* Tries exact ID match first, then case-insensitive name match.
|
|
30
|
-
*/
|
|
31
|
-
export async function resolveApp(client, nameOrId) {
|
|
32
|
-
const apps = await client.listApps();
|
|
33
|
-
if (apps.length === 0) {
|
|
34
|
-
console.error('No apps found.');
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
// Exact ID match
|
|
38
|
-
const byId = apps.find(a => a.id === nameOrId);
|
|
39
|
-
if (byId)
|
|
40
|
-
return byId;
|
|
41
|
-
// Case-insensitive name match
|
|
42
|
-
const lower = nameOrId.toLowerCase();
|
|
43
|
-
const byName = apps.filter(a => a.name.toLowerCase() === lower);
|
|
44
|
-
if (byName.length === 1)
|
|
45
|
-
return byName[0];
|
|
46
|
-
if (byName.length > 1) {
|
|
47
|
-
console.error(`Ambiguous app name "${nameOrId}". Matches: ${byName.map(a => `${a.name} (${a.id})`).join(', ')}`);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
console.error(`App "${nameOrId}" not found. Available: ${apps.map(a => a.name).join(', ')}`);
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { homedir } from 'os';
|
|
4
|
-
/** Load setup state, checking project-level then user-level. */
|
|
5
|
-
export function loadSetupState() {
|
|
6
|
-
const projectPath = join(process.cwd(), '.runwork', 'setup.json');
|
|
7
|
-
const userPath = join(homedir(), '.runwork', 'setup.json');
|
|
8
|
-
for (const p of [projectPath, userPath]) {
|
|
9
|
-
if (existsSync(p)) {
|
|
10
|
-
try {
|
|
11
|
-
return JSON.parse(readFileSync(p, 'utf-8'));
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
continue;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime SQLite adapter.
|
|
3
|
-
*
|
|
4
|
-
* Selects a SQLite backend at module load time:
|
|
5
|
-
* 1. `bun:sqlite` when running under Bun (the compiled standalone CLI binary)
|
|
6
|
-
* 2. `node:sqlite` when running on Node >= 22.5 (the `npx runwork@latest` path)
|
|
7
|
-
* 3. null, in which case SQLite-backed telemetry features degrade gracefully
|
|
8
|
-
* instead of breaking install
|
|
9
|
-
*
|
|
10
|
-
* This replaces the previous hard dependency on `better-sqlite3`, which
|
|
11
|
-
* required a native npm build and failed in restricted sandboxes, locked-down
|
|
12
|
-
* corporate environments, and low-privilege containers.
|
|
13
|
-
*/
|
|
14
|
-
type SqliteFlavor = 'bun' | 'node';
|
|
15
|
-
interface StatementHandle {
|
|
16
|
-
get(...params: unknown[]): unknown;
|
|
17
|
-
all(...params: unknown[]): unknown[];
|
|
18
|
-
run(...params: unknown[]): unknown;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Returns true when a SQLite runtime is available.
|
|
22
|
-
* Use this to gate telemetry / agent-stats features that can degrade gracefully.
|
|
23
|
-
*/
|
|
24
|
-
export declare function sqliteAvailable(): boolean;
|
|
25
|
-
/**
|
|
26
|
-
* Returns the name of the SQLite backend in use, or null if none is available.
|
|
27
|
-
* Intended for doctor / diagnostic output.
|
|
28
|
-
*/
|
|
29
|
-
export declare function sqliteFlavor(): SqliteFlavor | null;
|
|
30
|
-
export declare function queryReadonlySqlite(dbPath: string, sql: string): string;
|
|
31
|
-
/**
|
|
32
|
-
* Handle returned by `openWritableSqlite` for write operations.
|
|
33
|
-
* Callers are responsible for calling `close()` when done.
|
|
34
|
-
*/
|
|
35
|
-
export interface WritableSqlite {
|
|
36
|
-
prepare(sql: string): StatementHandle;
|
|
37
|
-
close(): void;
|
|
38
|
-
readonly flavor: SqliteFlavor;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Open a writable SQLite database. Returns null when no SQLite runtime is
|
|
42
|
-
* available, letting the caller degrade gracefully instead of crashing.
|
|
43
|
-
*
|
|
44
|
-
* On failure to open the database (missing file, permission denied, locked),
|
|
45
|
-
* this also returns null.
|
|
46
|
-
*/
|
|
47
|
-
export declare function openWritableSqlite(dbPath: string): WritableSqlite | null;
|
|
48
|
-
export {};
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime SQLite adapter.
|
|
3
|
-
*
|
|
4
|
-
* Selects a SQLite backend at module load time:
|
|
5
|
-
* 1. `bun:sqlite` when running under Bun (the compiled standalone CLI binary)
|
|
6
|
-
* 2. `node:sqlite` when running on Node >= 22.5 (the `npx runwork@latest` path)
|
|
7
|
-
* 3. null, in which case SQLite-backed telemetry features degrade gracefully
|
|
8
|
-
* instead of breaking install
|
|
9
|
-
*
|
|
10
|
-
* This replaces the previous hard dependency on `better-sqlite3`, which
|
|
11
|
-
* required a native npm build and failed in restricted sandboxes, locked-down
|
|
12
|
-
* corporate environments, and low-privilege containers.
|
|
13
|
-
*/
|
|
14
|
-
let adapter = null;
|
|
15
|
-
async function loadAdapter() {
|
|
16
|
-
// Try bun:sqlite first. Bun defines a global `Bun` object we can sniff for.
|
|
17
|
-
const bunGlobal = globalThis.Bun;
|
|
18
|
-
if (typeof bunGlobal !== 'undefined') {
|
|
19
|
-
try {
|
|
20
|
-
const specifier = 'bun:sqlite';
|
|
21
|
-
const mod = (await import(/* @vite-ignore */ specifier));
|
|
22
|
-
if (mod?.Database) {
|
|
23
|
-
return {
|
|
24
|
-
flavor: 'bun',
|
|
25
|
-
Database: mod.Database,
|
|
26
|
-
readOnlyOptionKey: 'readonly',
|
|
27
|
-
readOnlyOptionValue: true,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
// bun:sqlite unavailable despite Bun global; fall through to Node path
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
// Try node:sqlite. Available in Node >= 22.5 stable.
|
|
36
|
-
try {
|
|
37
|
-
const specifier = 'node:sqlite';
|
|
38
|
-
const mod = (await import(/* @vite-ignore */ specifier));
|
|
39
|
-
if (mod?.DatabaseSync) {
|
|
40
|
-
return {
|
|
41
|
-
flavor: 'node',
|
|
42
|
-
Database: mod.DatabaseSync,
|
|
43
|
-
readOnlyOptionKey: 'readOnly',
|
|
44
|
-
readOnlyOptionValue: true,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// node:sqlite unavailable (older Node, or flag off)
|
|
50
|
-
}
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
// Top-level await: module load blocks until an adapter is chosen.
|
|
54
|
-
// The CLI is an ESM package running on Bun or modern Node, both of which
|
|
55
|
-
// support top-level await.
|
|
56
|
-
adapter = await loadAdapter();
|
|
57
|
-
/**
|
|
58
|
-
* Returns true when a SQLite runtime is available.
|
|
59
|
-
* Use this to gate telemetry / agent-stats features that can degrade gracefully.
|
|
60
|
-
*/
|
|
61
|
-
export function sqliteAvailable() {
|
|
62
|
-
return adapter !== null;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Returns the name of the SQLite backend in use, or null if none is available.
|
|
66
|
-
* Intended for doctor / diagnostic output.
|
|
67
|
-
*/
|
|
68
|
-
export function sqliteFlavor() {
|
|
69
|
-
return adapter?.flavor ?? null;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Execute a read-only SQL query against a SQLite database and return the rows
|
|
73
|
-
* serialised as `value1|value2|value3` per row, newline separated. Matches the
|
|
74
|
-
* legacy `querySqlite` contract so existing parsers do not have to change.
|
|
75
|
-
*
|
|
76
|
-
* Returns an empty string on any failure (missing database, locked, corrupt,
|
|
77
|
-
* unavailable runtime). Callers must tolerate the empty-string path.
|
|
78
|
-
*/
|
|
79
|
-
const BUSY_TIMEOUT_MS = 5000;
|
|
80
|
-
function setBusyTimeout(db) {
|
|
81
|
-
// bun:sqlite has no `timeout` constructor option and node:sqlite had a
|
|
82
|
-
// moving target across versions, so set busy_timeout via a PRAGMA that
|
|
83
|
-
// works on every SQLite build. PRAGMA busy_timeout is a per-connection
|
|
84
|
-
// runtime setting and does not require write permissions.
|
|
85
|
-
try {
|
|
86
|
-
db.prepare(`PRAGMA busy_timeout = ${BUSY_TIMEOUT_MS}`).run();
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
/* some flavors refuse PRAGMA on readonly; best-effort */
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
export function queryReadonlySqlite(dbPath, sql) {
|
|
93
|
-
if (!adapter)
|
|
94
|
-
return '';
|
|
95
|
-
let db = null;
|
|
96
|
-
try {
|
|
97
|
-
const options = {
|
|
98
|
-
[adapter.readOnlyOptionKey]: adapter.readOnlyOptionValue,
|
|
99
|
-
};
|
|
100
|
-
db = new adapter.Database(dbPath, options);
|
|
101
|
-
setBusyTimeout(db);
|
|
102
|
-
const rows = db.prepare(sql).all();
|
|
103
|
-
return rows.map((row) => Object.values(row).join('|')).join('\n');
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
return '';
|
|
107
|
-
}
|
|
108
|
-
finally {
|
|
109
|
-
try {
|
|
110
|
-
db?.close();
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
/* ignore close errors */
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Open a writable SQLite database. Returns null when no SQLite runtime is
|
|
119
|
-
* available, letting the caller degrade gracefully instead of crashing.
|
|
120
|
-
*
|
|
121
|
-
* On failure to open the database (missing file, permission denied, locked),
|
|
122
|
-
* this also returns null.
|
|
123
|
-
*/
|
|
124
|
-
export function openWritableSqlite(dbPath) {
|
|
125
|
-
if (!adapter)
|
|
126
|
-
return null;
|
|
127
|
-
try {
|
|
128
|
-
const db = new adapter.Database(dbPath);
|
|
129
|
-
setBusyTimeout(db);
|
|
130
|
-
const flavor = adapter.flavor;
|
|
131
|
-
return {
|
|
132
|
-
prepare: (sql) => db.prepare(sql),
|
|
133
|
-
close: () => {
|
|
134
|
-
try {
|
|
135
|
-
db.close();
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
/* ignore close errors */
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
flavor,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
|
-
}
|
package/dist/utils/sqlite.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Read-only SQLite query helper used by agent stats readers.
|
|
3
|
-
*
|
|
4
|
-
* This file used to hard-depend on `better-sqlite3`, which required a native
|
|
5
|
-
* npm build and failed in low-privilege containers and corporate sandboxes.
|
|
6
|
-
* It now re-exports the runtime-aware adapter which picks `bun:sqlite` in the
|
|
7
|
-
* compiled standalone binary, `node:sqlite` when running under `npx`, and a
|
|
8
|
-
* structured "unavailable" path otherwise (returns empty string).
|
|
9
|
-
*
|
|
10
|
-
* The `querySqlite` name is preserved so existing call sites and mocks in
|
|
11
|
-
* tests keep working.
|
|
12
|
-
*/
|
|
13
|
-
export { queryReadonlySqlite as querySqlite } from './sqlite-adapter.js';
|
|
14
|
-
export { openWritableSqlite, sqliteAvailable, sqliteFlavor, type WritableSqlite } from './sqlite-adapter.js';
|
package/dist/utils/sqlite.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Read-only SQLite query helper used by agent stats readers.
|
|
3
|
-
*
|
|
4
|
-
* This file used to hard-depend on `better-sqlite3`, which required a native
|
|
5
|
-
* npm build and failed in low-privilege containers and corporate sandboxes.
|
|
6
|
-
* It now re-exports the runtime-aware adapter which picks `bun:sqlite` in the
|
|
7
|
-
* compiled standalone binary, `node:sqlite` when running under `npx`, and a
|
|
8
|
-
* structured "unavailable" path otherwise (returns empty string).
|
|
9
|
-
*
|
|
10
|
-
* The `querySqlite` name is preserved so existing call sites and mocks in
|
|
11
|
-
* tests keep working.
|
|
12
|
-
*/
|
|
13
|
-
export { queryReadonlySqlite as querySqlite } from './sqlite-adapter.js';
|
|
14
|
-
export { openWritableSqlite, sqliteAvailable, sqliteFlavor } from './sqlite-adapter.js';
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thin wrappers around `child_process.execFileSync` and `spawn` that
|
|
3
|
-
* default `windowsHide: true`. On Windows, every console-subsystem
|
|
4
|
-
* subprocess we spawn (git, where.exe, registry queries) creates its
|
|
5
|
-
* own console window unless this flag is set. With our hot paths --
|
|
6
|
-
* auto-commit's git invocations, manifest's `git ls-files`, the sync
|
|
7
|
-
* loop's git rebase / fetch / push -- a missing flag visibly flashes a
|
|
8
|
-
* console window every few seconds, which Codex Desktop users see as
|
|
9
|
-
* "empty terminals keep popping up."
|
|
10
|
-
*
|
|
11
|
-
* Use these as drop-in replacements for the `child_process` exports.
|
|
12
|
-
* Existing options the caller passes still win (so you can opt back to
|
|
13
|
-
* `windowsHide: false` if you genuinely need the window, e.g. for
|
|
14
|
-
* interactive prompts -- though we don't have any of those in our
|
|
15
|
-
* subprocess paths today).
|
|
16
|
-
*/
|
|
17
|
-
import { execFileSync as cpExecFileSync, spawn as cpSpawn } from 'child_process';
|
|
18
|
-
export declare const execFileSync: typeof cpExecFileSync;
|
|
19
|
-
export declare const spawn: typeof cpSpawn;
|
package/dist/utils/subprocess.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thin wrappers around `child_process.execFileSync` and `spawn` that
|
|
3
|
-
* default `windowsHide: true`. On Windows, every console-subsystem
|
|
4
|
-
* subprocess we spawn (git, where.exe, registry queries) creates its
|
|
5
|
-
* own console window unless this flag is set. With our hot paths --
|
|
6
|
-
* auto-commit's git invocations, manifest's `git ls-files`, the sync
|
|
7
|
-
* loop's git rebase / fetch / push -- a missing flag visibly flashes a
|
|
8
|
-
* console window every few seconds, which Codex Desktop users see as
|
|
9
|
-
* "empty terminals keep popping up."
|
|
10
|
-
*
|
|
11
|
-
* Use these as drop-in replacements for the `child_process` exports.
|
|
12
|
-
* Existing options the caller passes still win (so you can opt back to
|
|
13
|
-
* `windowsHide: false` if you genuinely need the window, e.g. for
|
|
14
|
-
* interactive prompts -- though we don't have any of those in our
|
|
15
|
-
* subprocess paths today).
|
|
16
|
-
*/
|
|
17
|
-
import { execFileSync as cpExecFileSync, spawn as cpSpawn, } from 'child_process';
|
|
18
|
-
// We re-export with the *exact* `typeof` signature of the originals so
|
|
19
|
-
// caller-side overload narrowing (encoding -> string vs Buffer return
|
|
20
|
-
// type) keeps working. The implementation forwards through the original
|
|
21
|
-
// after merging in `windowsHide: true` as a default.
|
|
22
|
-
export const execFileSync = ((file, args, options) => {
|
|
23
|
-
return cpExecFileSync(file, args, { windowsHide: true, ...(options ?? {}) });
|
|
24
|
-
});
|
|
25
|
-
export const spawn = ((command, args, options) => {
|
|
26
|
-
return cpSpawn(command, args ?? [], { windowsHide: true, ...(options ?? {}) });
|
|
27
|
-
});
|
package/dist/utils/which.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cross-platform binary detection.
|
|
3
|
-
* Uses `which` on macOS/Linux, `where.exe` on Windows.
|
|
4
|
-
* Returns the resolved path on success, null if not found.
|
|
5
|
-
*/
|
|
6
|
-
export declare function whichBinary(name: string): string | null;
|
|
7
|
-
/**
|
|
8
|
-
* Check if a desktop app is currently running by process name.
|
|
9
|
-
* On macOS: checks for the .app bundle process via pgrep.
|
|
10
|
-
* On Windows: uses tasklist to find the .exe.
|
|
11
|
-
* On Linux: uses pgrep for the binary name.
|
|
12
|
-
* Returns true if the process is found, false otherwise.
|
|
13
|
-
*/
|
|
14
|
-
export declare function isAppRunning(appName: string): boolean;
|
package/dist/utils/which.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from './subprocess.js';
|
|
2
|
-
import { platform } from 'os';
|
|
3
|
-
/**
|
|
4
|
-
* Cross-platform binary detection.
|
|
5
|
-
* Uses `which` on macOS/Linux, `where.exe` on Windows.
|
|
6
|
-
* Returns the resolved path on success, null if not found.
|
|
7
|
-
*/
|
|
8
|
-
export function whichBinary(name) {
|
|
9
|
-
try {
|
|
10
|
-
const cmd = platform() === 'win32' ? 'where.exe' : 'which';
|
|
11
|
-
const result = execFileSync(cmd, [name], { stdio: 'pipe' }).toString().trim();
|
|
12
|
-
// `where.exe` may return multiple lines; take the first
|
|
13
|
-
return result.split(/[\r\n]+/)[0].trim() || null;
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Check if a desktop app is currently running by process name.
|
|
21
|
-
* On macOS: checks for the .app bundle process via pgrep.
|
|
22
|
-
* On Windows: uses tasklist to find the .exe.
|
|
23
|
-
* On Linux: uses pgrep for the binary name.
|
|
24
|
-
* Returns true if the process is found, false otherwise.
|
|
25
|
-
*/
|
|
26
|
-
export function isAppRunning(appName) {
|
|
27
|
-
try {
|
|
28
|
-
const os = platform();
|
|
29
|
-
if (os === 'darwin') {
|
|
30
|
-
// pgrep -f matches against the full command line, catching Electron apps
|
|
31
|
-
execFileSync('pgrep', ['-f', `${appName}.app`], { stdio: 'pipe' });
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
else if (os === 'win32') {
|
|
35
|
-
const result = execFileSync('tasklist', ['/FI', `IMAGENAME eq ${appName}.exe`, '/NH'], { stdio: 'pipe' }).toString();
|
|
36
|
-
return result.includes(`${appName}.exe`);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
execFileSync('pgrep', ['-x', appName.toLowerCase()], { stdio: 'pipe' });
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// pgrep exits non-zero when no processes match
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
package/dist/utils/zip.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export declare function extractZip(zipData: ArrayBuffer, targetDir: string): void;
|
|
2
|
-
/**
|
|
3
|
-
* Walk `sourceDir` recursively and write a zip file at `outputPath`.
|
|
4
|
-
* Entry paths inside the zip are forward-slash relative paths from
|
|
5
|
-
* `sourceDir`, matching the cross-platform convention that zip tools use.
|
|
6
|
-
*/
|
|
7
|
-
export declare function createZipFromDir(sourceDir: string, outputPath: string): void;
|
package/dist/utils/zip.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs';
|
|
2
|
-
import { join, dirname, relative, sep } from 'path';
|
|
3
|
-
import { unzipSync, zipSync } from 'fflate';
|
|
4
|
-
export function extractZip(zipData, targetDir) {
|
|
5
|
-
const files = unzipSync(new Uint8Array(zipData));
|
|
6
|
-
for (const [path, data] of Object.entries(files)) {
|
|
7
|
-
const fullPath = join(targetDir, path);
|
|
8
|
-
// Directory entries end with /
|
|
9
|
-
if (path.endsWith('/')) {
|
|
10
|
-
mkdirSync(fullPath, { recursive: true });
|
|
11
|
-
continue;
|
|
12
|
-
}
|
|
13
|
-
// Ensure parent directory exists
|
|
14
|
-
mkdirSync(dirname(fullPath), { recursive: true });
|
|
15
|
-
writeFileSync(fullPath, data);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Walk `sourceDir` recursively and write a zip file at `outputPath`.
|
|
20
|
-
* Entry paths inside the zip are forward-slash relative paths from
|
|
21
|
-
* `sourceDir`, matching the cross-platform convention that zip tools use.
|
|
22
|
-
*/
|
|
23
|
-
export function createZipFromDir(sourceDir, outputPath) {
|
|
24
|
-
const files = {};
|
|
25
|
-
const walk = (dir) => {
|
|
26
|
-
for (const entry of readdirSync(dir)) {
|
|
27
|
-
const absPath = join(dir, entry);
|
|
28
|
-
const stats = statSync(absPath);
|
|
29
|
-
if (stats.isDirectory()) {
|
|
30
|
-
walk(absPath);
|
|
31
|
-
}
|
|
32
|
-
else if (stats.isFile()) {
|
|
33
|
-
const relPath = relative(sourceDir, absPath).split(sep).join('/');
|
|
34
|
-
files[relPath] = readFileSync(absPath);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
walk(sourceDir);
|
|
39
|
-
const zipped = zipSync(files);
|
|
40
|
-
mkdirSync(dirname(outputPath), { recursive: true });
|
|
41
|
-
writeFileSync(outputPath, zipped);
|
|
42
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { summarizeFreshness } from '../freshness.js';
|
|
3
|
-
import { detectViteError } from '../preview.js';
|
|
4
|
-
describe('validate/freshness summarizeFreshness()', () => {
|
|
5
|
-
const base = { localSha: 'a', remoteSha: 'a', ahead: 0, behind: 0, uncommitted: false };
|
|
6
|
-
it('is in-sync when local==remote, no ahead/behind, clean tree', () => {
|
|
7
|
-
expect(summarizeFreshness(base).inSync).toBe(true);
|
|
8
|
-
});
|
|
9
|
-
it('is not in-sync with uncommitted changes', () => {
|
|
10
|
-
expect(summarizeFreshness({ ...base, uncommitted: true }).inSync).toBe(false);
|
|
11
|
-
});
|
|
12
|
-
it('is not in-sync when ahead of the remote', () => {
|
|
13
|
-
expect(summarizeFreshness({ ...base, ahead: 2 }).inSync).toBe(false);
|
|
14
|
-
});
|
|
15
|
-
it('is not in-sync when behind the remote', () => {
|
|
16
|
-
expect(summarizeFreshness({ ...base, behind: 1 }).inSync).toBe(false);
|
|
17
|
-
});
|
|
18
|
-
it('is not in-sync when there is no remote ref', () => {
|
|
19
|
-
expect(summarizeFreshness({ ...base, remoteSha: null }).inSync).toBe(false);
|
|
20
|
-
});
|
|
21
|
-
it('is not in-sync when there is no local HEAD', () => {
|
|
22
|
-
expect(summarizeFreshness({ ...base, localSha: null }).inSync).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
it('passes through the raw counts', () => {
|
|
25
|
-
const f = summarizeFreshness({ localSha: 'x', remoteSha: 'y', ahead: 3, behind: 1, uncommitted: true });
|
|
26
|
-
expect(f).toMatchObject({ ahead: 3, behind: 1, uncommitted: true, inSync: false });
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
describe('validate/preview detectViteError()', () => {
|
|
30
|
-
it('detects the Vite error overlay element', () => {
|
|
31
|
-
expect(detectViteError('<vite-error-overlay></vite-error-overlay>')).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
it('detects a plugin transform error', () => {
|
|
34
|
-
expect(detectViteError('[plugin:vite:react-babel] Unexpected token')).toBe(true);
|
|
35
|
-
});
|
|
36
|
-
it('detects a failed import resolution', () => {
|
|
37
|
-
expect(detectViteError('Failed to resolve import "./missing" from "src/App.tsx"')).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
it('returns false for a healthy HTML document', () => {
|
|
40
|
-
expect(detectViteError('<!DOCTYPE html><html><body><div id="root"></div></body></html>')).toBe(false);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git sync-freshness: how the local working tree relates to the deploy remote
|
|
3
|
-
* (`runwork/main`). Answers "do I have changes that aren't synced/deployed?"
|
|
4
|
-
* without scraping the sandbox (friction log #10).
|
|
5
|
-
*/
|
|
6
|
-
export interface Freshness {
|
|
7
|
-
localSha: string | null;
|
|
8
|
-
remoteSha: string | null;
|
|
9
|
-
ahead: number;
|
|
10
|
-
behind: number;
|
|
11
|
-
uncommitted: boolean;
|
|
12
|
-
/** true when local == remote and the tree is clean. */
|
|
13
|
-
inSync: boolean;
|
|
14
|
-
}
|
|
15
|
-
export interface FreshnessInput {
|
|
16
|
-
localSha: string | null;
|
|
17
|
-
remoteSha: string | null;
|
|
18
|
-
ahead: number;
|
|
19
|
-
behind: number;
|
|
20
|
-
uncommitted: boolean;
|
|
21
|
-
}
|
|
22
|
-
/** Pure: derive the in-sync verdict from the raw git counts/flags. */
|
|
23
|
-
export declare function summarizeFreshness(input: FreshnessInput): Freshness;
|
|
24
|
-
/**
|
|
25
|
-
* Collect git freshness for `cwd`. Best-effort fetches `runwork/main` first so
|
|
26
|
-
* the comparison reflects the real remote tip; tolerates offline/no-remote.
|
|
27
|
-
*/
|
|
28
|
-
export declare function getGitFreshness(cwd: string): Freshness;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from '../utils/subprocess.js';
|
|
2
|
-
/** Pure: derive the in-sync verdict from the raw git counts/flags. */
|
|
3
|
-
export function summarizeFreshness(input) {
|
|
4
|
-
const inSync = input.localSha !== null &&
|
|
5
|
-
input.remoteSha !== null &&
|
|
6
|
-
input.ahead === 0 &&
|
|
7
|
-
input.behind === 0 &&
|
|
8
|
-
!input.uncommitted;
|
|
9
|
-
return { ...input, inSync };
|
|
10
|
-
}
|
|
11
|
-
function gitOut(cwd, args) {
|
|
12
|
-
try {
|
|
13
|
-
return execFileSync('git', args, { cwd, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Collect git freshness for `cwd`. Best-effort fetches `runwork/main` first so
|
|
21
|
-
* the comparison reflects the real remote tip; tolerates offline/no-remote.
|
|
22
|
-
*/
|
|
23
|
-
export function getGitFreshness(cwd) {
|
|
24
|
-
// Best-effort: refresh the remote-tracking ref. Failure (offline, no remote)
|
|
25
|
-
// just means we compare against whatever ref we already have.
|
|
26
|
-
try {
|
|
27
|
-
execFileSync('git', ['fetch', 'runwork', 'main'], { cwd, stdio: 'pipe' });
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
/* offline or no runwork remote -- non-fatal */
|
|
31
|
-
}
|
|
32
|
-
const localSha = gitOut(cwd, ['rev-parse', 'HEAD']);
|
|
33
|
-
const remoteSha = gitOut(cwd, ['rev-parse', 'runwork/main']);
|
|
34
|
-
let ahead = 0;
|
|
35
|
-
let behind = 0;
|
|
36
|
-
if (localSha && remoteSha) {
|
|
37
|
-
// `<behind>\t<ahead>` relative to runwork/main...HEAD
|
|
38
|
-
const counts = gitOut(cwd, ['rev-list', '--left-right', '--count', 'runwork/main...HEAD']);
|
|
39
|
-
if (counts) {
|
|
40
|
-
const [b, a] = counts.split(/\s+/).map(n => parseInt(n, 10));
|
|
41
|
-
behind = Number.isFinite(b) ? b : 0;
|
|
42
|
-
ahead = Number.isFinite(a) ? a : 0;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const porcelain = gitOut(cwd, ['status', '--porcelain']);
|
|
46
|
-
const uncommitted = porcelain !== null && porcelain.length > 0;
|
|
47
|
-
return summarizeFreshness({ localSha, remoteSha, ahead, behind, uncommitted });
|
|
48
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Liveness of the preview deployment: does it respond, and is it serving a
|
|
3
|
-
* working build (vs a Vite error overlay)? This is the cheap "is my change
|
|
4
|
-
* live and compiling" signal the friction log (#10) reached for by hand.
|
|
5
|
-
*/
|
|
6
|
-
export interface PreviewLiveness {
|
|
7
|
-
url: string | null;
|
|
8
|
-
responds: boolean;
|
|
9
|
-
status: number | null;
|
|
10
|
-
/** A Vite/build error overlay was detected in the served HTML. */
|
|
11
|
-
errorDetected: boolean;
|
|
12
|
-
error?: string;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Heuristically detect a Vite dev-server error overlay / transform error in
|
|
16
|
-
* served HTML. These are the markers Vite injects when a module fails to
|
|
17
|
-
* compile, so their presence means the preview is serving a broken build.
|
|
18
|
-
*/
|
|
19
|
-
export declare function detectViteError(html: string): boolean;
|
|
20
|
-
/** Fetch the preview URL and report whether it's live and error-free. */
|
|
21
|
-
export declare function checkPreview(url: string | null): Promise<PreviewLiveness>;
|