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/agents/cline.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { AgentAdapter, AgentConfigOverride, CleanupManifest, McpServerEntry, SkillFile } from './types.js';
|
|
2
|
-
export declare class ClineAdapter implements AgentAdapter {
|
|
3
|
-
name: string;
|
|
4
|
-
slug: string;
|
|
5
|
-
mcpProvidesSkills: boolean;
|
|
6
|
-
detect(): Promise<boolean>;
|
|
7
|
-
supportsMcpScope(scope: 'project' | 'user'): boolean;
|
|
8
|
-
supportsSkills(): boolean;
|
|
9
|
-
writeMcpServers(servers: McpServerEntry[], _scope: 'project' | 'user'): Promise<void>;
|
|
10
|
-
writeSkills(skills: SkillFile[], scope: 'project' | 'user'): Promise<void>;
|
|
11
|
-
writeInstructionHint(hint: string, scope: 'project' | 'user'): Promise<void>;
|
|
12
|
-
writeTeamInstructions(instructions: string, scope: 'project' | 'user'): Promise<void>;
|
|
13
|
-
writeAgentConfig(config: AgentConfigOverride, scope: 'project' | 'user'): Promise<void>;
|
|
14
|
-
cleanup(scope: 'project' | 'user', manifest?: CleanupManifest): Promise<void>;
|
|
15
|
-
}
|
package/dist/agents/cline.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, unlinkSync, writeFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { homedir } from 'os';
|
|
4
|
-
import { whichBinary } from '../utils/which.js';
|
|
5
|
-
import { buildSkillMd } from './types.js';
|
|
6
|
-
import { mergeJsonMcpServers, removeRunworkMcpServers } from './utils/json-config.js';
|
|
7
|
-
export class ClineAdapter {
|
|
8
|
-
name = 'Cline';
|
|
9
|
-
slug = 'cline';
|
|
10
|
-
mcpProvidesSkills = true;
|
|
11
|
-
async detect() {
|
|
12
|
-
return !!whichBinary('cline');
|
|
13
|
-
}
|
|
14
|
-
supportsMcpScope(scope) {
|
|
15
|
-
return scope === 'user';
|
|
16
|
-
}
|
|
17
|
-
supportsSkills() {
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
async writeMcpServers(servers, _scope) {
|
|
21
|
-
const configPath = join(homedir(), '.cline', 'data', 'settings', 'cline_mcp_settings.json');
|
|
22
|
-
const entries = {};
|
|
23
|
-
for (const s of servers) {
|
|
24
|
-
entries[s.name] = {
|
|
25
|
-
url: s.url,
|
|
26
|
-
...(s.headers ? { headers: s.headers } : {}),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
mergeJsonMcpServers(configPath, entries, 'mcpServers');
|
|
30
|
-
}
|
|
31
|
-
async writeSkills(skills, scope) {
|
|
32
|
-
if (scope === 'user')
|
|
33
|
-
return;
|
|
34
|
-
const rulesDir = join(process.cwd(), '.clinerules');
|
|
35
|
-
mkdirSync(rulesDir, { recursive: true });
|
|
36
|
-
for (const skill of skills) {
|
|
37
|
-
writeFileSync(join(rulesDir, `${skill.filename}.md`), buildSkillMd(skill));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
async writeInstructionHint(hint, scope) {
|
|
41
|
-
if (scope === 'user')
|
|
42
|
-
return;
|
|
43
|
-
const filePath = join(process.cwd(), '.clinerules', 'runwork.md');
|
|
44
|
-
mkdirSync(join(filePath, '..'), { recursive: true });
|
|
45
|
-
writeFileSync(filePath, hint);
|
|
46
|
-
}
|
|
47
|
-
async writeTeamInstructions(instructions, scope) {
|
|
48
|
-
if (scope === 'user')
|
|
49
|
-
return;
|
|
50
|
-
const filePath = join(process.cwd(), '.clinerules', 'runwork-team.md');
|
|
51
|
-
mkdirSync(join(filePath, '..'), { recursive: true });
|
|
52
|
-
writeFileSync(filePath, instructions);
|
|
53
|
-
}
|
|
54
|
-
// ── Agent config (globalState.json) ────────────────────────────────
|
|
55
|
-
async writeAgentConfig(config, scope) {
|
|
56
|
-
if (scope !== 'user')
|
|
57
|
-
return;
|
|
58
|
-
const globalStatePath = join(homedir(), '.cline', 'data', 'globalState.json');
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
-
let state = {};
|
|
61
|
-
if (existsSync(globalStatePath)) {
|
|
62
|
-
try {
|
|
63
|
-
state = JSON.parse(readFileSync(globalStatePath, 'utf-8'));
|
|
64
|
-
}
|
|
65
|
-
catch { /* start fresh */ }
|
|
66
|
-
}
|
|
67
|
-
if (config.modelPreference) {
|
|
68
|
-
state.apiModelId = config.modelPreference;
|
|
69
|
-
}
|
|
70
|
-
if (config.permissionRules) {
|
|
71
|
-
if (!state.autoApprovalSettings)
|
|
72
|
-
state.autoApprovalSettings = {};
|
|
73
|
-
if (!state.autoApprovalSettings.actions)
|
|
74
|
-
state.autoApprovalSettings.actions = {};
|
|
75
|
-
if (config.permissionRules.defaultMode === 'auto') {
|
|
76
|
-
state.autoApprovalSettings.enabled = true;
|
|
77
|
-
state.autoApprovalSettings.actions.readFiles = true;
|
|
78
|
-
state.autoApprovalSettings.actions.editFiles = true;
|
|
79
|
-
state.autoApprovalSettings.actions.executeSafeCommands = true;
|
|
80
|
-
state.autoApprovalSettings.actions.useMcp = true;
|
|
81
|
-
}
|
|
82
|
-
else if (config.permissionRules.defaultMode === 'default') {
|
|
83
|
-
state.autoApprovalSettings.enabled = false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
mkdirSync(join(globalStatePath, '..'), { recursive: true });
|
|
87
|
-
writeFileSync(globalStatePath, JSON.stringify(state, null, 2));
|
|
88
|
-
}
|
|
89
|
-
// ── Cleanup (uninstall) ────────────────────────────────────────────
|
|
90
|
-
async cleanup(scope, manifest) {
|
|
91
|
-
// 1. Remove MCP entries (user scope only)
|
|
92
|
-
if (scope === 'user') {
|
|
93
|
-
const configPath = join(homedir(), '.cline', 'data', 'settings', 'cline_mcp_settings.json');
|
|
94
|
-
removeRunworkMcpServers(configPath, 'mcpServers');
|
|
95
|
-
}
|
|
96
|
-
// 2. Remove rule files (project scope only)
|
|
97
|
-
if (scope === 'project') {
|
|
98
|
-
const rulesDir = join(process.cwd(), '.clinerules');
|
|
99
|
-
if (existsSync(rulesDir)) {
|
|
100
|
-
for (const file of ['runwork.md', 'runwork-team.md']) {
|
|
101
|
-
const filePath = join(rulesDir, file);
|
|
102
|
-
if (existsSync(filePath)) {
|
|
103
|
-
try {
|
|
104
|
-
unlinkSync(filePath);
|
|
105
|
-
}
|
|
106
|
-
catch { /* best-effort */ }
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Remove only skill .md files that we synced
|
|
110
|
-
if (manifest?.skillFilenames.length) {
|
|
111
|
-
const allowed = new Set(manifest.skillFilenames.map(f => `${f}.md`));
|
|
112
|
-
for (const entry of readdirSync(rulesDir)) {
|
|
113
|
-
if (allowed.has(entry)) {
|
|
114
|
-
try {
|
|
115
|
-
unlinkSync(join(rulesDir, entry));
|
|
116
|
-
}
|
|
117
|
-
catch { /* best-effort */ }
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Remove dir if empty
|
|
122
|
-
try {
|
|
123
|
-
if (readdirSync(rulesDir).length === 0)
|
|
124
|
-
rmSync(rulesDir, { recursive: true });
|
|
125
|
-
}
|
|
126
|
-
catch { /* best-effort */ }
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
package/dist/agents/codex.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { AgentAdapter, AgentConfigOverride, AgentUsageStats, CleanupManifest, McpServerEntry, SkillFile, SkillUsageEntry } from './types.js';
|
|
2
|
-
export declare class CodexAdapter implements AgentAdapter {
|
|
3
|
-
name: string;
|
|
4
|
-
slug: string;
|
|
5
|
-
mcpProvidesSkills: boolean;
|
|
6
|
-
detect(): Promise<boolean>;
|
|
7
|
-
supportsMcpScope(_scope: 'project' | 'user'): boolean;
|
|
8
|
-
supportsSkills(): boolean;
|
|
9
|
-
writeMcpServers(servers: McpServerEntry[], _scope: 'project' | 'user'): Promise<void>;
|
|
10
|
-
writeSkills(skills: SkillFile[], scope: 'project' | 'user'): Promise<void>;
|
|
11
|
-
writeInstructionHint(hint: string, scope: 'project' | 'user'): Promise<void>;
|
|
12
|
-
writeTeamInstructions(instructions: string, scope: 'project' | 'user'): Promise<void>;
|
|
13
|
-
writeAgentConfig(config: AgentConfigOverride, scope: 'project' | 'user'): Promise<void>;
|
|
14
|
-
cleanup(scope: 'project' | 'user', manifest?: CleanupManifest): Promise<void>;
|
|
15
|
-
readUsageStats(lastSyncAt: string | null): Promise<AgentUsageStats | null>;
|
|
16
|
-
readVersion(): Promise<string | null>;
|
|
17
|
-
readSkillUsage(lastSyncAt: string | null): Promise<SkillUsageEntry[] | null>;
|
|
18
|
-
/** Parse a rollout JSONL file for skill data */
|
|
19
|
-
private parseRolloutForSkills;
|
|
20
|
-
/**
|
|
21
|
-
* Register a workspace directory in the Codex desktop app's project list.
|
|
22
|
-
* Adds the path to electron-saved-workspace-roots, project-order, and
|
|
23
|
-
* electron-workspace-root-labels. Skips active-workspace-roots to avoid
|
|
24
|
-
* force-switching the user's active project.
|
|
25
|
-
*
|
|
26
|
-
* Returns 'written' if changes were made, 'already_registered' if the
|
|
27
|
-
* path was already present, or 'app_running' if Codex is open and would
|
|
28
|
-
* overwrite our changes.
|
|
29
|
-
*/
|
|
30
|
-
registerDesktopWorkspace(workspacePath: string, label: string): 'written' | 'already_registered' | 'app_running';
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Codex Desktop (OpenAI's GUI app) reads its config from the same `~/.codex`
|
|
34
|
-
* directory as the Codex CLI, so every sync/cleanup behavior inherits from
|
|
35
|
-
* CodexAdapter unchanged. Only the identity (slug/name) and the installation
|
|
36
|
-
* detection differ -- the desktop app is detected by application bundle
|
|
37
|
-
* presence, not by a `codex` binary on PATH.
|
|
38
|
-
*/
|
|
39
|
-
export declare class CodexDesktopAdapter extends CodexAdapter {
|
|
40
|
-
name: string;
|
|
41
|
-
slug: string;
|
|
42
|
-
detect(): Promise<boolean>;
|
|
43
|
-
readUsageStats(): Promise<null>;
|
|
44
|
-
}
|
package/dist/agents/codex.js
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { homedir } from 'os';
|
|
4
|
-
import { parse, stringify } from 'smol-toml';
|
|
5
|
-
import { buildSkillMd, appendTokenToUrl, RUNWORK_WORKSPACE_MCP_NAME } from './types.js';
|
|
6
|
-
function isRunworkManagedCodexKey(key) {
|
|
7
|
-
return (key === RUNWORK_WORKSPACE_MCP_NAME ||
|
|
8
|
-
key.startsWith('runwork-') ||
|
|
9
|
-
key.startsWith('Runwork-'));
|
|
10
|
-
}
|
|
11
|
-
import { writeHintToFile, writeTeamInstructionsToFile, removeHintFromFile, removeTeamInstructionsFromFile } from './utils/instruction-hint.js';
|
|
12
|
-
import { querySqlite } from '../utils/sqlite.js';
|
|
13
|
-
import { whichBinary, isAppRunning } from '../utils/which.js';
|
|
14
|
-
import { runAgentDetection } from './detection.js';
|
|
15
|
-
import { getRegistryAgent } from './registry.js';
|
|
16
|
-
export class CodexAdapter {
|
|
17
|
-
name = 'Codex';
|
|
18
|
-
slug = 'codex';
|
|
19
|
-
mcpProvidesSkills = true;
|
|
20
|
-
async detect() {
|
|
21
|
-
return !!whichBinary('codex');
|
|
22
|
-
}
|
|
23
|
-
supportsMcpScope(_scope) {
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
supportsSkills() {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
async writeMcpServers(servers, _scope) {
|
|
30
|
-
// Codex uses config.toml with [mcp_servers.*] sections
|
|
31
|
-
const configPath = join(homedir(), '.codex', 'config.toml');
|
|
32
|
-
let parsed = {};
|
|
33
|
-
if (existsSync(configPath)) {
|
|
34
|
-
parsed = parse(readFileSync(configPath, 'utf-8'));
|
|
35
|
-
}
|
|
36
|
-
if (!parsed.mcp_servers || typeof parsed.mcp_servers !== 'object') {
|
|
37
|
-
parsed.mcp_servers = {};
|
|
38
|
-
}
|
|
39
|
-
const mcpServers = parsed.mcp_servers;
|
|
40
|
-
// Remove existing runwork-managed entries. Handles legacy lowercase
|
|
41
|
-
// ("runwork-foo"), sanitized PascalCase ("Runwork-foo"), and the bare
|
|
42
|
-
// workspace-tools name ("Runwork").
|
|
43
|
-
for (const key of Object.keys(mcpServers)) {
|
|
44
|
-
if (isRunworkManagedCodexKey(key)) {
|
|
45
|
-
delete mcpServers[key];
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// Add new entries (sanitize names to match Codex's ^[a-zA-Z0-9_-]+$ requirement).
|
|
49
|
-
for (const s of servers) {
|
|
50
|
-
const safeName = s.name.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
|
|
51
|
-
const entry = { url: s.url };
|
|
52
|
-
if (s.name === RUNWORK_WORKSPACE_MCP_NAME) {
|
|
53
|
-
// Preserve the known-working behavior: embed the workspace key in the URL.
|
|
54
|
-
// Codex's header-based auth was historically unreliable here, so do NOT change it.
|
|
55
|
-
const token = s.headers?.Authorization?.replace(/^Bearer\s+/i, '');
|
|
56
|
-
if (token)
|
|
57
|
-
entry.url = appendTokenToUrl(s.url, token);
|
|
58
|
-
}
|
|
59
|
-
else if (s.headers && Object.keys(s.headers).length > 0) {
|
|
60
|
-
// External servers: forward headers via Codex's documented http_headers field
|
|
61
|
-
// (static literal values). These had no prior working path, so this is additive.
|
|
62
|
-
entry.http_headers = s.headers;
|
|
63
|
-
}
|
|
64
|
-
mcpServers[safeName] = entry;
|
|
65
|
-
}
|
|
66
|
-
mkdirSync(join(configPath, '..'), { recursive: true });
|
|
67
|
-
writeFileSync(configPath, stringify(parsed));
|
|
68
|
-
}
|
|
69
|
-
async writeSkills(skills, scope) {
|
|
70
|
-
const baseDir = scope === 'project'
|
|
71
|
-
? join(process.cwd(), '.codex', 'skills')
|
|
72
|
-
: join(homedir(), '.codex', 'skills');
|
|
73
|
-
for (const skill of skills) {
|
|
74
|
-
if (skill.name !== skill.filename) {
|
|
75
|
-
const oldDir = join(baseDir, skill.name);
|
|
76
|
-
if (existsSync(oldDir)) {
|
|
77
|
-
try {
|
|
78
|
-
rmSync(oldDir, { recursive: true, force: true });
|
|
79
|
-
}
|
|
80
|
-
catch { /* best-effort */ }
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
const skillDir = join(baseDir, skill.filename);
|
|
84
|
-
mkdirSync(skillDir, { recursive: true });
|
|
85
|
-
writeFileSync(join(skillDir, 'SKILL.md'), buildSkillMd(skill));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async writeInstructionHint(hint, scope) {
|
|
89
|
-
const filePath = scope === 'project'
|
|
90
|
-
? join(process.cwd(), 'AGENTS.md')
|
|
91
|
-
: join(homedir(), '.codex', 'AGENTS.md');
|
|
92
|
-
writeHintToFile(filePath, hint);
|
|
93
|
-
}
|
|
94
|
-
async writeTeamInstructions(instructions, scope) {
|
|
95
|
-
const filePath = scope === 'project'
|
|
96
|
-
? join(process.cwd(), 'AGENTS.md')
|
|
97
|
-
: join(homedir(), '.codex', 'AGENTS.md');
|
|
98
|
-
writeTeamInstructionsToFile(filePath, instructions);
|
|
99
|
-
}
|
|
100
|
-
// ── Agent config (TOML) ───────────────────────────────────────────
|
|
101
|
-
async writeAgentConfig(config, scope) {
|
|
102
|
-
const configPath = scope === 'project'
|
|
103
|
-
? join(process.cwd(), '.codex', 'config.toml')
|
|
104
|
-
: join(homedir(), '.codex', 'config.toml');
|
|
105
|
-
let parsed = {};
|
|
106
|
-
if (existsSync(configPath)) {
|
|
107
|
-
parsed = parse(readFileSync(configPath, 'utf-8'));
|
|
108
|
-
}
|
|
109
|
-
if (config.modelPreference) {
|
|
110
|
-
parsed.model = config.modelPreference;
|
|
111
|
-
}
|
|
112
|
-
if (config.permissionRules?.defaultMode) {
|
|
113
|
-
const modeMap = {
|
|
114
|
-
auto: 'never',
|
|
115
|
-
default: 'on-request',
|
|
116
|
-
plan: 'untrusted',
|
|
117
|
-
};
|
|
118
|
-
parsed.approval_policy = modeMap[config.permissionRules.defaultMode] ?? config.permissionRules.defaultMode;
|
|
119
|
-
}
|
|
120
|
-
// Apply minimum permission floors: only upgrade, never downgrade
|
|
121
|
-
if (config.minimumPermissions) {
|
|
122
|
-
for (const { field, order, minimum } of config.minimumPermissions) {
|
|
123
|
-
const current = typeof parsed[field] === 'string' ? parsed[field] : '';
|
|
124
|
-
const currentIdx = order.indexOf(current);
|
|
125
|
-
const minimumIdx = order.indexOf(minimum);
|
|
126
|
-
// Upgrade if current is unknown (not in order) or more restrictive than minimum
|
|
127
|
-
if (currentIdx < minimumIdx) {
|
|
128
|
-
parsed[field] = minimum;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
mkdirSync(join(configPath, '..'), { recursive: true });
|
|
133
|
-
writeFileSync(configPath, stringify(parsed));
|
|
134
|
-
}
|
|
135
|
-
// ── Cleanup (uninstall) ────────────────────────────────────────────
|
|
136
|
-
async cleanup(scope, manifest) {
|
|
137
|
-
// 1. Remove MCP server entries from config.toml
|
|
138
|
-
const configPath = join(homedir(), '.codex', 'config.toml');
|
|
139
|
-
if (existsSync(configPath)) {
|
|
140
|
-
try {
|
|
141
|
-
const parsed = parse(readFileSync(configPath, 'utf-8'));
|
|
142
|
-
if (parsed.mcp_servers && typeof parsed.mcp_servers === 'object') {
|
|
143
|
-
const mcpServers = parsed.mcp_servers;
|
|
144
|
-
for (const key of Object.keys(mcpServers)) {
|
|
145
|
-
// Codex TOML sanitizes names via writeMcpServers, so the JSON-style
|
|
146
|
-
// "Runwork: " prefix is never actually written here. Match the real
|
|
147
|
-
// on-disk forms: "runwork-*" (legacy), "Runwork-*" (previous), and
|
|
148
|
-
// the bare "Runwork" name used for workspace tools.
|
|
149
|
-
if (isRunworkManagedCodexKey(key)) {
|
|
150
|
-
delete mcpServers[key];
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
writeFileSync(configPath, stringify(parsed));
|
|
155
|
-
}
|
|
156
|
-
catch { /* best-effort */ }
|
|
157
|
-
}
|
|
158
|
-
// 2. Remove only skill directories that we synced (listed in manifest)
|
|
159
|
-
const skillsDir = scope === 'project'
|
|
160
|
-
? join(process.cwd(), '.codex', 'skills')
|
|
161
|
-
: join(homedir(), '.codex', 'skills');
|
|
162
|
-
if (existsSync(skillsDir) && manifest?.skillFilenames.length) {
|
|
163
|
-
const allowed = new Set(manifest.skillFilenames);
|
|
164
|
-
for (const entry of readdirSync(skillsDir)) {
|
|
165
|
-
if (!allowed.has(entry))
|
|
166
|
-
continue;
|
|
167
|
-
try {
|
|
168
|
-
rmSync(join(skillsDir, entry), { recursive: true, force: true });
|
|
169
|
-
}
|
|
170
|
-
catch { /* best-effort */ }
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// 3. Remove instruction hints and team instructions
|
|
174
|
-
const instructionFile = scope === 'project'
|
|
175
|
-
? join(process.cwd(), 'AGENTS.md')
|
|
176
|
-
: join(homedir(), '.codex', 'AGENTS.md');
|
|
177
|
-
removeHintFromFile(instructionFile);
|
|
178
|
-
removeTeamInstructionsFromFile(instructionFile);
|
|
179
|
-
}
|
|
180
|
-
// ── Usage stats (passive, best-effort) ─────────────────────────────
|
|
181
|
-
async readUsageStats(lastSyncAt) {
|
|
182
|
-
try {
|
|
183
|
-
const codexDir = join(homedir(), '.codex');
|
|
184
|
-
if (!existsSync(codexDir))
|
|
185
|
-
return null;
|
|
186
|
-
const sinceMs = lastSyncAt ? new Date(lastSyncAt).getTime() : 0;
|
|
187
|
-
const sinceSec = Math.floor(sinceMs / 1000);
|
|
188
|
-
const dbPath = join(codexDir, 'state_5.sqlite');
|
|
189
|
-
if (!existsSync(dbPath))
|
|
190
|
-
return null;
|
|
191
|
-
// Filter on updated_at, not created_at: long-lived threads can accumulate
|
|
192
|
-
// activity post-sync without ever being "newly created". tokens_used is a
|
|
193
|
-
// lifetime per-thread total — summing active threads here overcounts when
|
|
194
|
-
// a thread was already partially used before lastSyncAt, but it's a far
|
|
195
|
-
// better signal than "0 because no new threads were spawned".
|
|
196
|
-
const countResult = querySqlite(dbPath, `SELECT count(*) FROM threads WHERE updated_at > ${sinceSec}`);
|
|
197
|
-
const sessionCount = parseInt(countResult) || 0;
|
|
198
|
-
const tokensResult = querySqlite(dbPath, `SELECT coalesce(sum(tokens_used), 0) FROM threads WHERE updated_at > ${sinceSec}`);
|
|
199
|
-
const tokensUsed = parseInt(tokensResult) || 0;
|
|
200
|
-
const latestResult = querySqlite(dbPath, `SELECT max(updated_at) FROM threads`);
|
|
201
|
-
const latestSec = parseInt(latestResult) || 0;
|
|
202
|
-
const versionsResult = querySqlite(dbPath, `SELECT DISTINCT cli_version FROM threads WHERE cli_version IS NOT NULL ORDER BY created_at DESC LIMIT 3`);
|
|
203
|
-
const versions = versionsResult ? versionsResult.split(/[\r\n]+/).filter(Boolean) : [];
|
|
204
|
-
let messageCount = 0;
|
|
205
|
-
const historyPath = join(codexDir, 'history.jsonl');
|
|
206
|
-
if (existsSync(historyPath)) {
|
|
207
|
-
const content = readFileSync(historyPath, 'utf-8').trim();
|
|
208
|
-
if (content) {
|
|
209
|
-
for (const line of content.split(/[\r\n]+/)) {
|
|
210
|
-
try {
|
|
211
|
-
const entry = JSON.parse(line);
|
|
212
|
-
if (entry.ts && entry.ts > sinceSec)
|
|
213
|
-
messageCount++;
|
|
214
|
-
}
|
|
215
|
-
catch {
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
if (sessionCount === 0 && (latestSec * 1000) <= sinceMs)
|
|
222
|
-
return null;
|
|
223
|
-
return {
|
|
224
|
-
hasNewActivity: sessionCount > 0,
|
|
225
|
-
sessionCount,
|
|
226
|
-
messageCount,
|
|
227
|
-
toolCallCount: 0,
|
|
228
|
-
tokensUsed,
|
|
229
|
-
aiLinesAdded: 0,
|
|
230
|
-
aiLinesRemoved: 0,
|
|
231
|
-
lastActiveAt: latestSec > 0 ? new Date(latestSec * 1000).toISOString() : null,
|
|
232
|
-
extra: versions.length > 0 ? { cliVersions: versions } : undefined,
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
catch {
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
async readVersion() {
|
|
240
|
-
try {
|
|
241
|
-
const versionPath = join(homedir(), '.codex', 'version.json');
|
|
242
|
-
if (existsSync(versionPath)) {
|
|
243
|
-
const data = JSON.parse(readFileSync(versionPath, 'utf-8'));
|
|
244
|
-
return data.latest_version ?? null;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
catch { /* best-effort */ }
|
|
248
|
-
return null;
|
|
249
|
-
}
|
|
250
|
-
async readSkillUsage(lastSyncAt) {
|
|
251
|
-
// Codex rollout JSONL files contain a session_meta entry whose
|
|
252
|
-
// `instructions` field lists all skills available in the session.
|
|
253
|
-
// Skills appear as "- name: description (file: path/SKILL.md)".
|
|
254
|
-
// This gives us reach data (which skills were loaded), not invocation.
|
|
255
|
-
//
|
|
256
|
-
// Rollout files live at ~/.codex/sessions/<year>/<month>/<day>/rollout-*.jsonl
|
|
257
|
-
// and are linked from the threads table via rollout_path.
|
|
258
|
-
try {
|
|
259
|
-
const sessionsDir = join(homedir(), '.codex', 'sessions');
|
|
260
|
-
if (!existsSync(sessionsDir))
|
|
261
|
-
return null;
|
|
262
|
-
const sinceMs = lastSyncAt ? new Date(lastSyncAt).getTime() : 0;
|
|
263
|
-
const skillCounts = new Map();
|
|
264
|
-
// Walk session directories by year/month/day
|
|
265
|
-
const walkDir = (dir) => {
|
|
266
|
-
let entries;
|
|
267
|
-
try {
|
|
268
|
-
entries = readdirSync(dir);
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
for (const entry of entries) {
|
|
274
|
-
const fullPath = join(dir, entry);
|
|
275
|
-
if (entry.endsWith('.jsonl')) {
|
|
276
|
-
let fileStat;
|
|
277
|
-
try {
|
|
278
|
-
fileStat = statSync(fullPath);
|
|
279
|
-
}
|
|
280
|
-
catch {
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
if (fileStat.mtimeMs <= sinceMs)
|
|
284
|
-
continue;
|
|
285
|
-
this.parseRolloutForSkills(fullPath, sinceMs, skillCounts);
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
// Recurse into year/month/day subdirectories
|
|
289
|
-
try {
|
|
290
|
-
if (statSync(fullPath).isDirectory())
|
|
291
|
-
walkDir(fullPath);
|
|
292
|
-
}
|
|
293
|
-
catch {
|
|
294
|
-
continue;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
walkDir(sessionsDir);
|
|
300
|
-
if (skillCounts.size === 0)
|
|
301
|
-
return null;
|
|
302
|
-
const results = [];
|
|
303
|
-
for (const [skillName, { count, lastTs }] of skillCounts) {
|
|
304
|
-
results.push({
|
|
305
|
-
skillName,
|
|
306
|
-
count,
|
|
307
|
-
lastUsedAt: new Date(lastTs).toISOString(),
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
return results;
|
|
311
|
-
}
|
|
312
|
-
catch {
|
|
313
|
-
return null;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
/** Parse a rollout JSONL file for skill data */
|
|
317
|
-
parseRolloutForSkills(filePath, sinceMs, skillCounts) {
|
|
318
|
-
let content;
|
|
319
|
-
try {
|
|
320
|
-
content = readFileSync(filePath, 'utf-8');
|
|
321
|
-
}
|
|
322
|
-
catch {
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
for (const line of content.split('\n')) {
|
|
326
|
-
if (!line)
|
|
327
|
-
continue;
|
|
328
|
-
let entry;
|
|
329
|
-
try {
|
|
330
|
-
entry = JSON.parse(line);
|
|
331
|
-
}
|
|
332
|
-
catch {
|
|
333
|
-
continue;
|
|
334
|
-
}
|
|
335
|
-
if (entry.type !== 'session_meta')
|
|
336
|
-
continue;
|
|
337
|
-
const payload = entry.payload;
|
|
338
|
-
if (!payload)
|
|
339
|
-
continue;
|
|
340
|
-
const tsRaw = entry.timestamp;
|
|
341
|
-
const ts = typeof tsRaw === 'string' ? Date.parse(tsRaw) : 0;
|
|
342
|
-
if (ts <= sinceMs)
|
|
343
|
-
continue;
|
|
344
|
-
const instructions = payload.instructions;
|
|
345
|
-
if (typeof instructions !== 'string')
|
|
346
|
-
continue;
|
|
347
|
-
// Parse "- name: description (file: path/SKILL.md)" entries from the
|
|
348
|
-
// "### Available skills" section. Skip Codex's built-in system skills
|
|
349
|
-
// (those installed under `.system/`, e.g. skill-creator,
|
|
350
|
-
// skill-installer) since they are bundled with the agent and would
|
|
351
|
-
// skew adoption metrics meant to track *user-installed* skills.
|
|
352
|
-
const skillRegex = /^- ([^:]+):\s+.+\(file:\s+(.+\/SKILL\.md)\)/gm;
|
|
353
|
-
let match;
|
|
354
|
-
while ((match = skillRegex.exec(instructions)) !== null) {
|
|
355
|
-
const skillName = match[1].trim();
|
|
356
|
-
const skillPath = match[2];
|
|
357
|
-
if (skillPath.includes('/.system/'))
|
|
358
|
-
continue;
|
|
359
|
-
const existing = skillCounts.get(skillName);
|
|
360
|
-
if (existing) {
|
|
361
|
-
existing.count++;
|
|
362
|
-
if (ts > existing.lastTs)
|
|
363
|
-
existing.lastTs = ts;
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
skillCounts.set(skillName, { count: 1, lastTs: ts });
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
// Only process the first session_meta per file
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
// ── Codex Desktop app workspace registration ──────────────────────
|
|
374
|
-
/**
|
|
375
|
-
* Register a workspace directory in the Codex desktop app's project list.
|
|
376
|
-
* Adds the path to electron-saved-workspace-roots, project-order, and
|
|
377
|
-
* electron-workspace-root-labels. Skips active-workspace-roots to avoid
|
|
378
|
-
* force-switching the user's active project.
|
|
379
|
-
*
|
|
380
|
-
* Returns 'written' if changes were made, 'already_registered' if the
|
|
381
|
-
* path was already present, or 'app_running' if Codex is open and would
|
|
382
|
-
* overwrite our changes.
|
|
383
|
-
*/
|
|
384
|
-
registerDesktopWorkspace(workspacePath, label) {
|
|
385
|
-
const statePath = join(homedir(), '.codex', '.codex-global-state.json');
|
|
386
|
-
// Read current state (or start fresh if file doesn't exist)
|
|
387
|
-
let state = {};
|
|
388
|
-
if (existsSync(statePath)) {
|
|
389
|
-
try {
|
|
390
|
-
state = JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
391
|
-
}
|
|
392
|
-
catch {
|
|
393
|
-
return 'app_running'; // corrupt file, don't touch
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
// Check if already registered in all required keys
|
|
397
|
-
const savedRoots = (Array.isArray(state['electron-saved-workspace-roots'])
|
|
398
|
-
? state['electron-saved-workspace-roots'] : []);
|
|
399
|
-
const projectOrder = (Array.isArray(state['project-order'])
|
|
400
|
-
? state['project-order'] : []);
|
|
401
|
-
const labels = (state['electron-workspace-root-labels'] && typeof state['electron-workspace-root-labels'] === 'object'
|
|
402
|
-
? state['electron-workspace-root-labels'] : {});
|
|
403
|
-
const inSaved = savedRoots.includes(workspacePath);
|
|
404
|
-
const inOrder = projectOrder.includes(workspacePath);
|
|
405
|
-
const inLabels = labels[workspacePath] === label;
|
|
406
|
-
if (inSaved && inOrder && inLabels) {
|
|
407
|
-
return 'already_registered';
|
|
408
|
-
}
|
|
409
|
-
// Codex desktop app holds this file in memory and overwrites on any state
|
|
410
|
-
// change. Writing while it's open is futile. Check if it's running.
|
|
411
|
-
if (isAppRunning('Codex')) {
|
|
412
|
-
return 'app_running';
|
|
413
|
-
}
|
|
414
|
-
// Merge our workspace into the state
|
|
415
|
-
if (!inSaved) {
|
|
416
|
-
savedRoots.push(workspacePath);
|
|
417
|
-
state['electron-saved-workspace-roots'] = savedRoots;
|
|
418
|
-
}
|
|
419
|
-
if (!inOrder) {
|
|
420
|
-
projectOrder.push(workspacePath);
|
|
421
|
-
state['project-order'] = projectOrder;
|
|
422
|
-
}
|
|
423
|
-
labels[workspacePath] = label;
|
|
424
|
-
state['electron-workspace-root-labels'] = labels;
|
|
425
|
-
mkdirSync(join(statePath, '..'), { recursive: true });
|
|
426
|
-
writeFileSync(statePath, JSON.stringify(state));
|
|
427
|
-
return 'written';
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Codex Desktop (OpenAI's GUI app) reads its config from the same `~/.codex`
|
|
432
|
-
* directory as the Codex CLI, so every sync/cleanup behavior inherits from
|
|
433
|
-
* CodexAdapter unchanged. Only the identity (slug/name) and the installation
|
|
434
|
-
* detection differ -- the desktop app is detected by application bundle
|
|
435
|
-
* presence, not by a `codex` binary on PATH.
|
|
436
|
-
*/
|
|
437
|
-
export class CodexDesktopAdapter extends CodexAdapter {
|
|
438
|
-
name = 'Codex';
|
|
439
|
-
slug = 'codex-app';
|
|
440
|
-
async detect() {
|
|
441
|
-
const def = getRegistryAgent('codex-app');
|
|
442
|
-
if (!def)
|
|
443
|
-
return false;
|
|
444
|
-
return runAgentDetection(def.detection);
|
|
445
|
-
}
|
|
446
|
-
// Usage stats come from ~/.codex/state_5.sqlite, which is shared between
|
|
447
|
-
// Codex CLI and Codex Desktop. Leaving the read here would double-count
|
|
448
|
-
// sessions/tokens whenever both adapters are detected on the same machine.
|
|
449
|
-
// Defer to CodexAdapter (slug 'codex') as the sole source of Codex stats.
|
|
450
|
-
async readUsageStats() {
|
|
451
|
-
return null;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { SkillFile } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Names of every skill the CLI ships as a built-in (written to user machines
|
|
4
|
-
* on each sync from code, never pulled from or pushed to the workspace).
|
|
5
|
-
*
|
|
6
|
-
* Sync uses this list to:
|
|
7
|
-
* 1. Skip these names when computing the local-vs-remote diff so they
|
|
8
|
-
* never appear in pull/push/conflict plans.
|
|
9
|
-
* 2. Warn the user (and offer cleanup) if a workspace skill with the same
|
|
10
|
-
* name exists -- it would be shadowed by the built-in locally and is
|
|
11
|
-
* probably a stale duplicate.
|
|
12
|
-
*
|
|
13
|
-
* Keep this list in sync with: intro-skill.ts (`runwork`) and the two
|
|
14
|
-
* `buildXConversationSkill` functions below.
|
|
15
|
-
*/
|
|
16
|
-
export declare const BUILT_IN_SKILL_NAMES: ReadonlyArray<string>;
|
|
17
|
-
export declare function buildShareConversationSkill(): SkillFile;
|
|
18
|
-
export declare function buildSaveConversationSkill(): SkillFile;
|