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
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Names of every skill the CLI ships as a built-in (written to user machines
|
|
3
|
-
* on each sync from code, never pulled from or pushed to the workspace).
|
|
4
|
-
*
|
|
5
|
-
* Sync uses this list to:
|
|
6
|
-
* 1. Skip these names when computing the local-vs-remote diff so they
|
|
7
|
-
* never appear in pull/push/conflict plans.
|
|
8
|
-
* 2. Warn the user (and offer cleanup) if a workspace skill with the same
|
|
9
|
-
* name exists -- it would be shadowed by the built-in locally and is
|
|
10
|
-
* probably a stale duplicate.
|
|
11
|
-
*
|
|
12
|
-
* Keep this list in sync with: intro-skill.ts (`runwork`) and the two
|
|
13
|
-
* `buildXConversationSkill` functions below.
|
|
14
|
-
*/
|
|
15
|
-
export const BUILT_IN_SKILL_NAMES = [
|
|
16
|
-
'runwork',
|
|
17
|
-
'share-conversation',
|
|
18
|
-
'save-conversation',
|
|
19
|
-
];
|
|
20
|
-
/**
|
|
21
|
-
* Built-in skills shipped by the runwork CLI on every sync. These are
|
|
22
|
-
* fundamental capabilities every user should have regardless of which
|
|
23
|
-
* workspace they belong to, so they live in the CLI codebase (like
|
|
24
|
-
* the dynamic `runwork` intro skill in ./intro-skill.ts) rather than
|
|
25
|
-
* as workspace-managed skills uploaded via the `save_skill` MCP tool.
|
|
26
|
-
*
|
|
27
|
-
* share-conversation: hand off the current AI conversation to a teammate
|
|
28
|
-
* save-conversation: personal checkpoint of the current AI conversation
|
|
29
|
-
*
|
|
30
|
-
* Both are paired with the CLI commands `runwork share-convo` and
|
|
31
|
-
* `runwork save-convo`. The skill body teaches the host LLM how to compose
|
|
32
|
-
* the verbatim transcript + metadata and invoke the CLI.
|
|
33
|
-
*/
|
|
34
|
-
const SHARE_CONVERSATION_CONTENT = `# Share Conversation Skill
|
|
35
|
-
|
|
36
|
-
This skill hands off the user's CURRENT AI conversation (the live chat you and the user are in) to a teammate so they can resume it natively in their own AI agent.
|
|
37
|
-
|
|
38
|
-
## When to trigger
|
|
39
|
-
|
|
40
|
-
The user said something like:
|
|
41
|
-
- "share this convo with X"
|
|
42
|
-
- "share this conversation with X@example.com"
|
|
43
|
-
- "send this to Mehmet"
|
|
44
|
-
- "hand off this thread to Alice"
|
|
45
|
-
- "forward this conversation to user@motaword.com"
|
|
46
|
-
|
|
47
|
-
X may be a workspace member name, an email, or a list. ASK if ambiguous.
|
|
48
|
-
|
|
49
|
-
## What you must do
|
|
50
|
-
|
|
51
|
-
**Step 1: Confirm the recipients.** Read the user's message, extract the email(s) or name(s). Confirm them back to the user before sending. Multiple recipients are allowed (comma-separated or multiple --to flags).
|
|
52
|
-
|
|
53
|
-
**Step 2: Compose a VERBATIM transcript of this conversation.** Write a complete markdown transcription of everything that has happened in this chat session so far. CRITICAL RULES:
|
|
54
|
-
|
|
55
|
-
- Transcribe EVERY message: user, assistant, tool calls, tool results.
|
|
56
|
-
- DO NOT summarize. DO NOT abbreviate. DO NOT skip anything you think is unimportant.
|
|
57
|
-
- Preserve the actual content of every assistant message, every Bash command, every Read result, every Edit, every Web search, every reasoning block you can recall, in chronological order.
|
|
58
|
-
- Use this structure:
|
|
59
|
-
|
|
60
|
-
\`\`\`markdown
|
|
61
|
-
# Conversation: <one-line title>
|
|
62
|
-
|
|
63
|
-
## Conversation
|
|
64
|
-
|
|
65
|
-
### Turn 1 - User
|
|
66
|
-
<user's exact message>
|
|
67
|
-
|
|
68
|
-
### Turn 2 - Assistant
|
|
69
|
-
<your exact response text>
|
|
70
|
-
|
|
71
|
-
#### Tool call: Read
|
|
72
|
-
**Input**: { "file_path": "..." }
|
|
73
|
-
**Result**: <full result, truncated only if absolutely necessary>
|
|
74
|
-
|
|
75
|
-
### Turn 3 - User
|
|
76
|
-
...
|
|
77
|
-
\`\`\`
|
|
78
|
-
|
|
79
|
-
- If you literally cannot remember every single tool result word-for-word (e.g., very long files), include as much as you have in context. Note explicitly when content is partial: \`[truncated for brevity; original was N lines]\`.
|
|
80
|
-
- The goal is full fidelity. If the context is too long, FAIL LOUDLY by telling the user "the conversation is too long to transcribe completely; please confirm you want me to proceed with a best-effort transcription" rather than silently dropping content.
|
|
81
|
-
|
|
82
|
-
Write the transcript to a temp file: \`/tmp/runwork-share-transcript-<random>.md\`.
|
|
83
|
-
|
|
84
|
-
**Step 3: Generate metadata.** Compose a JSON object with these fields based on this conversation's actual content:
|
|
85
|
-
|
|
86
|
-
\`\`\`json
|
|
87
|
-
{
|
|
88
|
-
"workMode": "coding | research | writing | planning | ops | communication | general",
|
|
89
|
-
"topicKeywords": ["3-5 short tags"],
|
|
90
|
-
"lastUserIntent": "one sentence describing what the user was trying to do at handoff time",
|
|
91
|
-
"primaryArtifacts": ["files / URLs / docs touched during the conversation"],
|
|
92
|
-
"openQuestions": ["unresolved questions or decisions at handoff time"],
|
|
93
|
-
"suggestedNextStep": "one sentence about what the recipient should do next",
|
|
94
|
-
"language": "programming or natural language used"
|
|
95
|
-
}
|
|
96
|
-
\`\`\`
|
|
97
|
-
|
|
98
|
-
Write this to \`/tmp/runwork-share-metadata-<random>.json\`.
|
|
99
|
-
|
|
100
|
-
**Step 4: Invoke the CLI.** Run:
|
|
101
|
-
|
|
102
|
-
\`\`\`bash
|
|
103
|
-
runwork share-convo \\
|
|
104
|
-
--to <email1> \\
|
|
105
|
-
--to <email2> \\
|
|
106
|
-
--transcript-file /tmp/runwork-share-transcript-<random>.md \\
|
|
107
|
-
--metadata-file /tmp/runwork-share-metadata-<random>.json \\
|
|
108
|
-
--title "<short title derived from the conversation>"
|
|
109
|
-
\`\`\`
|
|
110
|
-
|
|
111
|
-
The CLI auto-detects your host agent (Claude Code, Codex, etc.) and locates the native session file via \`$CLAUDE_CODE_SESSION_ID\` / \`$CODEX_THREAD_ID\` env vars. You typically don't need to pass \`--source-agent\` or \`--native-file\`.
|
|
112
|
-
|
|
113
|
-
If the user provided a personal note for the recipient, also pass \`--note "<message>"\`.
|
|
114
|
-
|
|
115
|
-
**Step 5: Tell the user.** Report the share ID and inbox URL returned by the CLI. Mention any non-workspace recipients that were invited.
|
|
116
|
-
|
|
117
|
-
## Fallback: when the CLI is not available
|
|
118
|
-
|
|
119
|
-
If \`runwork\` is not on PATH (rare; the CLI ships with workspace onboarding), use the Runwork MCP \`share_conversation\` tool instead. Pass the transcript content inline (lossier - no native bundle - but always works).
|
|
120
|
-
|
|
121
|
-
## Safety
|
|
122
|
-
|
|
123
|
-
- Never include credentials, API keys, or secrets in the transcript if you can identify them. Replace with \`[REDACTED]\`.
|
|
124
|
-
- If the conversation contained sensitive customer data, confirm with the user before sharing.
|
|
125
|
-
- Workspace permissions: non-member recipients trigger an invite, which requires the sender to have the \`members.invite\` permission (owner or admin). The CLI will error out clearly if not allowed.
|
|
126
|
-
|
|
127
|
-
## What this skill is NOT for
|
|
128
|
-
|
|
129
|
-
- Sharing files, apps, links, or screenshots. Use \`share-app\` or copy-paste.
|
|
130
|
-
- Continuing a paused conversation yourself. Use \`runwork resume <id>\` after the recipient runs it.
|
|
131
|
-
- Sharing a different conversation that's not the one you're currently in. The transcript is built from your live context.
|
|
132
|
-
`;
|
|
133
|
-
const SAVE_CONVERSATION_CONTENT = `# Save Conversation Skill
|
|
134
|
-
|
|
135
|
-
This skill creates a personal checkpoint of the user's CURRENT AI conversation. The user is the sole recipient; no notifications are sent to anyone else. They can resume it later in any of their AI agents on any of their machines.
|
|
136
|
-
|
|
137
|
-
## When to trigger
|
|
138
|
-
|
|
139
|
-
The user said something like:
|
|
140
|
-
- "save this convo"
|
|
141
|
-
- "checkpoint this"
|
|
142
|
-
- "bookmark this conversation"
|
|
143
|
-
- "save this for later"
|
|
144
|
-
- "save this for tomorrow"
|
|
145
|
-
- "stash this so I can pick it up at home"
|
|
146
|
-
|
|
147
|
-
If the user mentions ANOTHER PERSON or an email, use the \`share-conversation\` skill instead, not this one.
|
|
148
|
-
|
|
149
|
-
## What you must do
|
|
150
|
-
|
|
151
|
-
**Step 1: Confirm the intent.** A simple confirmation is enough: "Saving this conversation as a personal checkpoint."
|
|
152
|
-
|
|
153
|
-
**Step 2: Compose a VERBATIM transcript of this conversation.** Same rules as the share-conversation skill - faithful, complete, no summarization. Write to \`/tmp/runwork-save-transcript-<random>.md\`.
|
|
154
|
-
|
|
155
|
-
\`\`\`markdown
|
|
156
|
-
# Conversation: <one-line title>
|
|
157
|
-
|
|
158
|
-
## Conversation
|
|
159
|
-
|
|
160
|
-
### Turn 1 - User
|
|
161
|
-
<exact user message>
|
|
162
|
-
|
|
163
|
-
### Turn 2 - Assistant
|
|
164
|
-
<exact assistant response>
|
|
165
|
-
|
|
166
|
-
#### Tool call: <name>
|
|
167
|
-
**Input**: ...
|
|
168
|
-
**Result**: ...
|
|
169
|
-
\`\`\`
|
|
170
|
-
|
|
171
|
-
**Step 3: Generate metadata.** Same shape as share-conversation:
|
|
172
|
-
|
|
173
|
-
\`\`\`json
|
|
174
|
-
{
|
|
175
|
-
"workMode": "coding | research | writing | planning | ops | communication | general",
|
|
176
|
-
"topicKeywords": ["3-5 tags"],
|
|
177
|
-
"lastUserIntent": "what the user was trying to do at checkpoint time",
|
|
178
|
-
"primaryArtifacts": ["files / URLs touched"],
|
|
179
|
-
"openQuestions": ["unresolved items"],
|
|
180
|
-
"suggestedNextStep": "what to do when picking back up",
|
|
181
|
-
"language": "programming or natural language"
|
|
182
|
-
}
|
|
183
|
-
\`\`\`
|
|
184
|
-
|
|
185
|
-
Write to \`/tmp/runwork-save-metadata-<random>.json\`.
|
|
186
|
-
|
|
187
|
-
**Step 4: Invoke the CLI.**
|
|
188
|
-
|
|
189
|
-
\`\`\`bash
|
|
190
|
-
runwork save-convo \\
|
|
191
|
-
--transcript-file /tmp/runwork-save-transcript-<random>.md \\
|
|
192
|
-
--metadata-file /tmp/runwork-save-metadata-<random>.json \\
|
|
193
|
-
--title "<short title>"
|
|
194
|
-
\`\`\`
|
|
195
|
-
|
|
196
|
-
If the user provided a personal note ("save this with note: pick up after lunch"), pass \`--note "<message>"\`.
|
|
197
|
-
|
|
198
|
-
**Step 5: Tell the user.** Report the share ID. Mention they can resume from any machine with:
|
|
199
|
-
|
|
200
|
-
\`\`\`
|
|
201
|
-
runwork resume <share-id>
|
|
202
|
-
\`\`\`
|
|
203
|
-
|
|
204
|
-
## Fallback: when the CLI is not available
|
|
205
|
-
|
|
206
|
-
Use the Runwork MCP \`save_conversation\` tool with the transcript inline.
|
|
207
|
-
|
|
208
|
-
## What this skill is NOT for
|
|
209
|
-
|
|
210
|
-
- Sharing with another person. Use \`share-conversation\`.
|
|
211
|
-
- Saving files or code. Use the file system or git.
|
|
212
|
-
- Note-taking. Use a notes app or write to disk directly.
|
|
213
|
-
`;
|
|
214
|
-
export function buildShareConversationSkill() {
|
|
215
|
-
return {
|
|
216
|
-
name: 'share-conversation',
|
|
217
|
-
filename: 'share-conversation',
|
|
218
|
-
content: SHARE_CONVERSATION_CONTENT,
|
|
219
|
-
description: 'TRIGGERS when the user asks to share, send, hand off, or forward the CURRENT AI conversation (the live chat you are in right now) to a teammate by name or email. Examples: "share this convo with oytun@motaword.com", "send this conversation to Mehmet", "hand off this thread to Alice". Use ONLY when the user wants the OTHER PERSON to be able to continue this exact conversation in their own AI agent. Do NOT trigger for sharing files, apps, links, or unrelated content. For personal checkpoint (sharing to yourself), use the `save-conversation` skill instead.',
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
export function buildSaveConversationSkill() {
|
|
223
|
-
return {
|
|
224
|
-
name: 'save-conversation',
|
|
225
|
-
filename: 'save-conversation',
|
|
226
|
-
content: SAVE_CONVERSATION_CONTENT,
|
|
227
|
-
description: 'TRIGGERS when the user wants to save, checkpoint, bookmark, or stash the CURRENT AI conversation for themselves (not for a teammate). Examples: "save this convo", "checkpoint this", "bookmark this conversation", "save this for later", "save this so I can pick it up tomorrow", "save this for my other machine". Use ONLY when the user is the sole intended recipient. For sharing with a teammate (different person), use the `share-conversation` skill instead.',
|
|
228
|
-
};
|
|
229
|
-
}
|
package/dist/agents/cursor.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type { AgentAdapter, AgentConfigOverride, AgentUsageStats, CleanupManifest, McpServerEntry, SkillFile } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Merge a new managed list into a markerless on-disk array while preserving
|
|
4
|
-
* user-added entries.
|
|
5
|
-
*
|
|
6
|
-
* existing = what's currently on disk
|
|
7
|
-
* baseline = what we wrote on the previous sync (state.lastInjected). Items
|
|
8
|
-
* present here are assumed to be ours; subtracting them from
|
|
9
|
-
* existing leaves entries the user added themselves.
|
|
10
|
-
* incoming = the new managed set to inject (defaults already filtered for
|
|
11
|
-
* opt-outs, merged with team rules)
|
|
12
|
-
*
|
|
13
|
-
* If baseline is empty (bootstrap or first run with this CLI version), we
|
|
14
|
-
* assume nothing currently on disk is ours and preserve all existing entries.
|
|
15
|
-
*/
|
|
16
|
-
export declare function mergeMarkerless(existing: string[], baseline: string[], incoming: string[]): string[];
|
|
17
|
-
export declare class CursorAdapter implements AgentAdapter {
|
|
18
|
-
name: string;
|
|
19
|
-
slug: string;
|
|
20
|
-
mcpProvidesSkills: boolean;
|
|
21
|
-
detect(): Promise<boolean>;
|
|
22
|
-
supportsMcpScope(_scope: 'project' | 'user'): boolean;
|
|
23
|
-
supportsSkills(): boolean;
|
|
24
|
-
writeMcpServers(servers: McpServerEntry[], scope: 'project' | 'user'): Promise<void>;
|
|
25
|
-
writeSkills(skills: SkillFile[], scope: 'project' | 'user'): Promise<void>;
|
|
26
|
-
writeInstructionHint(hint: string, scope: 'project' | 'user'): Promise<void>;
|
|
27
|
-
writeTeamInstructions(instructions: string, scope: 'project' | 'user'): Promise<void>;
|
|
28
|
-
writeAgentConfig(config: AgentConfigOverride, scope: 'project' | 'user', baseline?: {
|
|
29
|
-
allow?: string[];
|
|
30
|
-
deny?: string[];
|
|
31
|
-
}): Promise<void>;
|
|
32
|
-
readManagedBlock(_scope: 'project' | 'user'): Promise<{
|
|
33
|
-
allow?: string[];
|
|
34
|
-
deny?: string[];
|
|
35
|
-
} | undefined>;
|
|
36
|
-
/**
|
|
37
|
-
* Merge domains into Cursor's sandbox network policy (~/.cursor/sandbox.json).
|
|
38
|
-
* Schema per https://cursor.com/docs/reference/sandbox:
|
|
39
|
-
* { "networkPolicy": { "default": "allow" | "deny", "allow": [...], "deny": [...] } }
|
|
40
|
-
* Only appends to the allow list; never flips `default` (respects user's existing policy).
|
|
41
|
-
* If the user has `default: allow`, all traffic is already permitted and entries are harmless.
|
|
42
|
-
* If the user has `default: deny`, our entries take effect and unblock Runwork.
|
|
43
|
-
*/
|
|
44
|
-
private mergeSandboxAllowlist;
|
|
45
|
-
cleanup(scope: 'project' | 'user', manifest?: CleanupManifest): Promise<void>;
|
|
46
|
-
readUsageStats(lastSyncAt: string | null): Promise<AgentUsageStats | null>;
|
|
47
|
-
readVersion(): Promise<string | null>;
|
|
48
|
-
}
|
package/dist/agents/cursor.js
DELETED
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readdirSync, unlinkSync, writeFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { homedir, platform } from 'os';
|
|
4
|
-
import { execFileSync } from '../utils/subprocess.js';
|
|
5
|
-
import { querySqlite, openWritableSqlite } from '../utils/sqlite.js';
|
|
6
|
-
import { whichBinary } from '../utils/which.js';
|
|
7
|
-
import { mergeJsonMcpServers, removeRunworkMcpServers, readJsonConfig, writeJsonConfig } from './utils/json-config.js';
|
|
8
|
-
/**
|
|
9
|
-
* Merge a new managed list into a markerless on-disk array while preserving
|
|
10
|
-
* user-added entries.
|
|
11
|
-
*
|
|
12
|
-
* existing = what's currently on disk
|
|
13
|
-
* baseline = what we wrote on the previous sync (state.lastInjected). Items
|
|
14
|
-
* present here are assumed to be ours; subtracting them from
|
|
15
|
-
* existing leaves entries the user added themselves.
|
|
16
|
-
* incoming = the new managed set to inject (defaults already filtered for
|
|
17
|
-
* opt-outs, merged with team rules)
|
|
18
|
-
*
|
|
19
|
-
* If baseline is empty (bootstrap or first run with this CLI version), we
|
|
20
|
-
* assume nothing currently on disk is ours and preserve all existing entries.
|
|
21
|
-
*/
|
|
22
|
-
export function mergeMarkerless(existing, baseline, incoming) {
|
|
23
|
-
const baselineSet = new Set(baseline);
|
|
24
|
-
const userEntries = existing.filter((item) => !baselineSet.has(item));
|
|
25
|
-
const seen = new Set();
|
|
26
|
-
const result = [];
|
|
27
|
-
for (const item of userEntries) {
|
|
28
|
-
if (!seen.has(item)) {
|
|
29
|
-
seen.add(item);
|
|
30
|
-
result.push(item);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
for (const item of incoming) {
|
|
34
|
-
if (!seen.has(item)) {
|
|
35
|
-
seen.add(item);
|
|
36
|
-
result.push(item);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return result;
|
|
40
|
-
}
|
|
41
|
-
export class CursorAdapter {
|
|
42
|
-
name = 'Cursor';
|
|
43
|
-
slug = 'cursor';
|
|
44
|
-
mcpProvidesSkills = true;
|
|
45
|
-
async detect() {
|
|
46
|
-
const os = platform();
|
|
47
|
-
if (os === 'darwin' && existsSync('/Applications/Cursor.app'))
|
|
48
|
-
return true;
|
|
49
|
-
return !!whichBinary('cursor');
|
|
50
|
-
}
|
|
51
|
-
supportsMcpScope(_scope) {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
supportsSkills() {
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
async writeMcpServers(servers, scope) {
|
|
58
|
-
const filePath = scope === 'project'
|
|
59
|
-
? join(process.cwd(), '.cursor', 'mcp.json')
|
|
60
|
-
: join(homedir(), '.cursor', 'mcp.json');
|
|
61
|
-
const entries = {};
|
|
62
|
-
for (const s of servers) {
|
|
63
|
-
entries[s.name] = {
|
|
64
|
-
url: s.url,
|
|
65
|
-
...(s.headers ? { headers: s.headers } : {}),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
mergeJsonMcpServers(filePath, entries, 'mcpServers');
|
|
69
|
-
}
|
|
70
|
-
async writeSkills(skills, scope) {
|
|
71
|
-
if (scope === 'user')
|
|
72
|
-
return;
|
|
73
|
-
const rulesDir = join(process.cwd(), '.cursor', 'rules');
|
|
74
|
-
mkdirSync(rulesDir, { recursive: true });
|
|
75
|
-
for (const skill of skills) {
|
|
76
|
-
const mdcContent = `---
|
|
77
|
-
description: "${skill.description}"
|
|
78
|
-
alwaysApply: false
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
${skill.content}`;
|
|
82
|
-
writeFileSync(join(rulesDir, `${skill.filename}.mdc`), mdcContent);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
async writeInstructionHint(hint, scope) {
|
|
86
|
-
// Cursor uses rules files, not a central instruction file
|
|
87
|
-
// Write as a rule file that's always loaded
|
|
88
|
-
const filePath = scope === 'project'
|
|
89
|
-
? join(process.cwd(), '.cursor', 'rules', 'runwork.mdc')
|
|
90
|
-
: join(homedir(), '.cursor', 'rules', 'runwork.mdc');
|
|
91
|
-
const mdcContent = `---\ndescription: "Runwork workspace connection"\nalwaysApply: true\n---\n\n${hint}`;
|
|
92
|
-
mkdirSync(join(filePath, '..'), { recursive: true });
|
|
93
|
-
writeFileSync(filePath, mdcContent);
|
|
94
|
-
}
|
|
95
|
-
async writeTeamInstructions(instructions, scope) {
|
|
96
|
-
const filePath = scope === 'project'
|
|
97
|
-
? join(process.cwd(), '.cursor', 'rules', 'runwork-team.mdc')
|
|
98
|
-
: join(homedir(), '.cursor', 'rules', 'runwork-team.mdc');
|
|
99
|
-
const mdcContent = `---\ndescription: "Team instructions from Runwork workspace"\nalwaysApply: true\n---\n\n${instructions}`;
|
|
100
|
-
mkdirSync(join(filePath, '..'), { recursive: true });
|
|
101
|
-
writeFileSync(filePath, mdcContent);
|
|
102
|
-
}
|
|
103
|
-
// ── Agent config (model, permissions via SQLite) ────────────────────
|
|
104
|
-
async writeAgentConfig(config, scope, baseline) {
|
|
105
|
-
if (scope !== 'user')
|
|
106
|
-
return;
|
|
107
|
-
// Sandbox network allowlist: merge into ~/.cursor/cli-config.json
|
|
108
|
-
if (config.networkAllowlist?.length) {
|
|
109
|
-
this.mergeSandboxAllowlist(config.networkAllowlist);
|
|
110
|
-
}
|
|
111
|
-
const os = platform();
|
|
112
|
-
let globalDbPath;
|
|
113
|
-
if (os === 'darwin') {
|
|
114
|
-
globalDbPath = join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
|
|
115
|
-
}
|
|
116
|
-
else if (os === 'win32') {
|
|
117
|
-
globalDbPath = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage', 'state.vscdb');
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
globalDbPath = join(homedir(), '.config', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
|
|
121
|
-
}
|
|
122
|
-
if (!existsSync(globalDbPath))
|
|
123
|
-
return;
|
|
124
|
-
const db = openWritableSqlite(globalDbPath);
|
|
125
|
-
if (!db) {
|
|
126
|
-
// SQLite runtime unavailable (older Node without node:sqlite, or not running
|
|
127
|
-
// under Bun) or the database is locked/inaccessible. Cursor config write is
|
|
128
|
-
// best-effort, so we silently skip.
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
try {
|
|
132
|
-
const storageKey = 'src.vs.platform.reactivestorage.browser.reactiveStorageServiceImpl.persistentStorage.applicationUser';
|
|
133
|
-
const row = db.prepare(`SELECT value FROM ItemTable WHERE key = ?`).get(storageKey);
|
|
134
|
-
if (!row?.value)
|
|
135
|
-
return;
|
|
136
|
-
const data = JSON.parse(row.value);
|
|
137
|
-
if (config.modelPreference) {
|
|
138
|
-
if (!data.aiSettings)
|
|
139
|
-
data.aiSettings = {};
|
|
140
|
-
data.aiSettings.composerModel = config.modelPreference;
|
|
141
|
-
}
|
|
142
|
-
if (config.permissionRules && data.composerState) {
|
|
143
|
-
if (config.permissionRules.allow) {
|
|
144
|
-
data.composerState.yoloCommandAllowlist = mergeMarkerless(data.composerState.yoloCommandAllowlist ?? [], baseline?.allow ?? [], config.permissionRules.allow);
|
|
145
|
-
}
|
|
146
|
-
if (config.permissionRules.deny) {
|
|
147
|
-
data.composerState.yoloCommandDenylist = mergeMarkerless(data.composerState.yoloCommandDenylist ?? [], baseline?.deny ?? [], config.permissionRules.deny);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
try {
|
|
151
|
-
db.prepare(`UPDATE ItemTable SET value = ? WHERE key = ?`).run(JSON.stringify(data), storageKey);
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
// Write failed (db locked while Cursor is running). Best-effort skip.
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
finally {
|
|
158
|
-
db.close();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
async readManagedBlock(_scope) {
|
|
162
|
-
// Cursor's yoloCommandAllowlist has no marker — there's no way to read a
|
|
163
|
-
// managed-subset from disk. The sync loop relies on the `baseline` arg
|
|
164
|
-
// (state.lastInjected) passed into writeAgentConfig instead.
|
|
165
|
-
return undefined;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Merge domains into Cursor's sandbox network policy (~/.cursor/sandbox.json).
|
|
169
|
-
* Schema per https://cursor.com/docs/reference/sandbox:
|
|
170
|
-
* { "networkPolicy": { "default": "allow" | "deny", "allow": [...], "deny": [...] } }
|
|
171
|
-
* Only appends to the allow list; never flips `default` (respects user's existing policy).
|
|
172
|
-
* If the user has `default: allow`, all traffic is already permitted and entries are harmless.
|
|
173
|
-
* If the user has `default: deny`, our entries take effect and unblock Runwork.
|
|
174
|
-
*/
|
|
175
|
-
mergeSandboxAllowlist(domains) {
|
|
176
|
-
const configPath = join(homedir(), '.cursor', 'sandbox.json');
|
|
177
|
-
try {
|
|
178
|
-
const config = readJsonConfig(configPath);
|
|
179
|
-
if (!config.networkPolicy)
|
|
180
|
-
config.networkPolicy = {};
|
|
181
|
-
const policy = config.networkPolicy;
|
|
182
|
-
const existing = (policy.allow ?? []);
|
|
183
|
-
const merged = new Set(existing);
|
|
184
|
-
for (const domain of domains) {
|
|
185
|
-
merged.add(domain);
|
|
186
|
-
}
|
|
187
|
-
policy.allow = [...merged];
|
|
188
|
-
writeJsonConfig(configPath, config);
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
191
|
-
// Best-effort: sandbox config write is non-fatal
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
// ── Cleanup (uninstall) ────────────────────────────────────────────
|
|
195
|
-
async cleanup(scope, manifest) {
|
|
196
|
-
// 1. Remove MCP entries
|
|
197
|
-
const mcpPath = scope === 'project'
|
|
198
|
-
? join(process.cwd(), '.cursor', 'mcp.json')
|
|
199
|
-
: join(homedir(), '.cursor', 'mcp.json');
|
|
200
|
-
removeRunworkMcpServers(mcpPath, 'mcpServers');
|
|
201
|
-
// 2. Remove rule files (skills, hint, team instructions)
|
|
202
|
-
const rulesDir = scope === 'project'
|
|
203
|
-
? join(process.cwd(), '.cursor', 'rules')
|
|
204
|
-
: join(homedir(), '.cursor', 'rules');
|
|
205
|
-
if (existsSync(rulesDir)) {
|
|
206
|
-
// Remove runwork.mdc and runwork-team.mdc
|
|
207
|
-
for (const file of ['runwork.mdc', 'runwork-team.mdc']) {
|
|
208
|
-
const filePath = join(rulesDir, file);
|
|
209
|
-
if (existsSync(filePath)) {
|
|
210
|
-
try {
|
|
211
|
-
unlinkSync(filePath);
|
|
212
|
-
}
|
|
213
|
-
catch { /* best-effort */ }
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Remove only skill .mdc files that we synced
|
|
217
|
-
if (manifest?.skillFilenames.length) {
|
|
218
|
-
const allowed = new Set(manifest.skillFilenames.map(f => `${f}.mdc`));
|
|
219
|
-
for (const entry of readdirSync(rulesDir)) {
|
|
220
|
-
if (allowed.has(entry)) {
|
|
221
|
-
try {
|
|
222
|
-
unlinkSync(join(rulesDir, entry));
|
|
223
|
-
}
|
|
224
|
-
catch { /* best-effort */ }
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
// ── Usage stats (passive, best-effort) ─────────────────────────────
|
|
231
|
-
async readUsageStats(lastSyncAt) {
|
|
232
|
-
try {
|
|
233
|
-
const sinceMs = lastSyncAt ? new Date(lastSyncAt).getTime() : 0;
|
|
234
|
-
// Query composerData from state.vscdb (cursorDiskKV table)
|
|
235
|
-
const os = platform();
|
|
236
|
-
let globalDbPath;
|
|
237
|
-
if (os === 'darwin') {
|
|
238
|
-
globalDbPath = join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
|
|
239
|
-
}
|
|
240
|
-
else if (os === 'win32') {
|
|
241
|
-
globalDbPath = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage', 'state.vscdb');
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
globalDbPath = join(homedir(), '.config', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
|
|
245
|
-
}
|
|
246
|
-
let sessionCount = 0;
|
|
247
|
-
let totalLinesAdded = 0;
|
|
248
|
-
let totalLinesRemoved = 0;
|
|
249
|
-
let latestActivity = 0;
|
|
250
|
-
let agenticSessions = 0;
|
|
251
|
-
let chatSessions = 0;
|
|
252
|
-
if (existsSync(globalDbPath)) {
|
|
253
|
-
const composerResult = querySqlite(globalDbPath, `SELECT value FROM cursorDiskKV WHERE key LIKE 'composerData-%'`);
|
|
254
|
-
if (composerResult) {
|
|
255
|
-
for (const line of composerResult.split('\n')) {
|
|
256
|
-
if (!line.trim())
|
|
257
|
-
continue;
|
|
258
|
-
try {
|
|
259
|
-
const data = JSON.parse(line);
|
|
260
|
-
const createdAt = data.createdAt ?? 0;
|
|
261
|
-
if (createdAt > sinceMs) {
|
|
262
|
-
sessionCount++;
|
|
263
|
-
totalLinesAdded += data.totalLinesAdded ?? 0;
|
|
264
|
-
totalLinesRemoved += data.totalLinesRemoved ?? 0;
|
|
265
|
-
if (data.unifiedMode === 'agent' || data.isAgentic)
|
|
266
|
-
agenticSessions++;
|
|
267
|
-
else
|
|
268
|
-
chatSessions++;
|
|
269
|
-
}
|
|
270
|
-
if (createdAt > latestActivity)
|
|
271
|
-
latestActivity = createdAt;
|
|
272
|
-
}
|
|
273
|
-
catch {
|
|
274
|
-
continue;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
// Check scored_commits for AI contribution data
|
|
280
|
-
// ~/.cursor/ is consistent across platforms (unlike Application Support paths)
|
|
281
|
-
const trackingDbPath = join(homedir(), '.cursor', 'ai-tracking', 'ai-code-tracking.db');
|
|
282
|
-
let aiCommitCount = 0;
|
|
283
|
-
let avgAiPercent = 0;
|
|
284
|
-
if (existsSync(trackingDbPath)) {
|
|
285
|
-
const sinceSec = Math.floor(sinceMs / 1000);
|
|
286
|
-
const commitResult = querySqlite(trackingDbPath, `SELECT count(*), avg(CAST(v2AiPercentage AS REAL)) FROM scored_commits WHERE scoredAt > ${sinceSec}`);
|
|
287
|
-
if (commitResult) {
|
|
288
|
-
const parts = commitResult.split('|');
|
|
289
|
-
aiCommitCount = parseInt(parts[0]) || 0;
|
|
290
|
-
avgAiPercent = parseFloat(parts[1]) || 0;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (sessionCount === 0 && latestActivity <= sinceMs)
|
|
294
|
-
return null;
|
|
295
|
-
return {
|
|
296
|
-
hasNewActivity: sessionCount > 0,
|
|
297
|
-
sessionCount,
|
|
298
|
-
messageCount: 0,
|
|
299
|
-
toolCallCount: 0,
|
|
300
|
-
tokensUsed: 0,
|
|
301
|
-
aiLinesAdded: totalLinesAdded,
|
|
302
|
-
aiLinesRemoved: totalLinesRemoved,
|
|
303
|
-
lastActiveAt: latestActivity > 0 ? new Date(latestActivity).toISOString() : null,
|
|
304
|
-
extra: {
|
|
305
|
-
agenticSessions,
|
|
306
|
-
chatSessions,
|
|
307
|
-
...(aiCommitCount > 0 ? { aiCommitCount, avgAiContributionPercent: Math.round(avgAiPercent) } : {}),
|
|
308
|
-
},
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
catch {
|
|
312
|
-
return null;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
async readVersion() {
|
|
316
|
-
try {
|
|
317
|
-
const output = execFileSync('cursor', ['--version'], { stdio: 'pipe' }).toString().trim();
|
|
318
|
-
return output;
|
|
319
|
-
}
|
|
320
|
-
catch {
|
|
321
|
-
return null;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Baked-in default permission rules that `runwork sync` injects into each
|
|
3
|
-
* supported agent's configuration.
|
|
4
|
-
*
|
|
5
|
-
* Defaults are user-scope only. They merge with team-managed rules from the
|
|
6
|
-
* workspace admin and are tracked in `~/.runwork/setup.json` under
|
|
7
|
-
* `agentDefaults[slug]` so that:
|
|
8
|
-
* 1. Removals stick: if a user deletes an injected entry, it never returns.
|
|
9
|
-
* 2. Newly added defaults flow in: CLI upgrades that ship more defaults
|
|
10
|
-
* auto-apply on the next sync.
|
|
11
|
-
* 3. Removed defaults disappear: shrinking the set here also removes the
|
|
12
|
-
* entries from users' on-disk config on next sync.
|
|
13
|
-
* 4. Tool removal resets state: `runwork agents remove <slug>` clears the
|
|
14
|
-
* per-agent state, so re-adding the tool starts from a clean bootstrap.
|
|
15
|
-
*
|
|
16
|
-
* Only agents whose permission model maps cleanly to command-pattern allow/deny
|
|
17
|
-
* lists appear here. Codex, Gemini, Cline, and Claude Desktop are intentionally
|
|
18
|
-
* absent (their config formats are toggle-based or tool-name-based and do not
|
|
19
|
-
* fit). Network domain allowlisting for those agents is handled separately via
|
|
20
|
-
* AgentConfigOverride.networkAllowlist in sync.ts.
|
|
21
|
-
*/
|
|
22
|
-
export interface BakedDefaults {
|
|
23
|
-
allow: string[];
|
|
24
|
-
deny: string[];
|
|
25
|
-
}
|
|
26
|
-
export declare const RUNWORK_AGENT_DEFAULTS: Record<string, BakedDefaults>;
|
|
27
|
-
/** Schema version recorded in setup.json. Bump when default-injection semantics change. */
|
|
28
|
-
export declare const AGENT_DEFAULTS_SCHEMA_VERSION = 1;
|
|
29
|
-
/** Slugs that have baked-in defaults. */
|
|
30
|
-
export declare function hasBakedDefaults(slug: string): boolean;
|