tarsk 0.4.4 → 0.4.6
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 +447375 -37
- package/package.json +2 -2
- package/dist/agent/agent.error-utils.d.ts +0 -14
- package/dist/agent/agent.error-utils.js +0 -52
- package/dist/agent/agent.event-transformer.d.ts +0 -55
- package/dist/agent/agent.event-transformer.js +0 -175
- package/dist/agent/agent.executor.d.ts +0 -26
- package/dist/agent/agent.executor.js +0 -286
- package/dist/agent/agent.model-resolver.d.ts +0 -22
- package/dist/agent/agent.model-resolver.js +0 -67
- package/dist/agent/agent.process-manager.d.ts +0 -57
- package/dist/agent/agent.process-manager.js +0 -262
- package/dist/agent/agent.processing-state-manager.d.ts +0 -74
- package/dist/agent/agent.processing-state-manager.js +0 -87
- package/dist/agent/agent.prompt-loader.d.ts +0 -16
- package/dist/agent/agent.prompt-loader.js +0 -227
- package/dist/agent/agent.subagent-executor.d.ts +0 -35
- package/dist/agent/agent.subagent-executor.js +0 -135
- package/dist/bun/index.d.ts +0 -2
- package/dist/bun/index.js +0 -165
- package/dist/cli.d.ts +0 -3
- package/dist/cli.js +0 -22
- package/dist/core/crypto.d.ts +0 -29
- package/dist/core/crypto.js +0 -166
- package/dist/core/dev-server-cache.d.ts +0 -46
- package/dist/core/dev-server-cache.js +0 -59
- package/dist/core/env-manager.d.ts +0 -3
- package/dist/core/env-manager.js +0 -60
- package/dist/core/error-responses.d.ts +0 -61
- package/dist/core/error-responses.js +0 -64
- package/dist/core/logger.d.ts +0 -10
- package/dist/core/logger.js +0 -47
- package/dist/core/paths.d.ts +0 -22
- package/dist/core/paths.js +0 -26
- package/dist/core/random-words.d.ts +0 -18
- package/dist/core/random-words.js +0 -135
- package/dist/core/response-builder.d.ts +0 -50
- package/dist/core/response-builder.js +0 -56
- package/dist/core/route-helpers.d.ts +0 -47
- package/dist/core/route-helpers.js +0 -54
- package/dist/core/run-command-detector.d.ts +0 -26
- package/dist/core/run-command-detector.js +0 -98
- package/dist/core/stream-helper.d.ts +0 -44
- package/dist/core/stream-helper.js +0 -50
- package/dist/core/utils.d.ts +0 -43
- package/dist/core/utils.js +0 -113
- package/dist/core/validation.d.ts +0 -10
- package/dist/core/validation.js +0 -20
- package/dist/database/database.d.ts +0 -40
- package/dist/database/database.encryption.d.ts +0 -33
- package/dist/database/database.encryption.js +0 -62
- package/dist/database/database.js +0 -480
- package/dist/database/database.state.d.ts +0 -52
- package/dist/database/database.state.js +0 -119
- package/dist/database/database.test-utils.d.ts +0 -22
- package/dist/database/database.test-utils.js +0 -39
- package/dist/database/database.types.d.ts +0 -3
- package/dist/database/database.types.js +0 -2
- package/dist/features/agents/agents.manager.d.ts +0 -24
- package/dist/features/agents/agents.manager.js +0 -200
- package/dist/features/ask-user/ask-user.routes.d.ts +0 -9
- package/dist/features/ask-user/ask-user.routes.js +0 -35
- package/dist/features/chat/chat-delete.route.d.ts +0 -15
- package/dist/features/chat/chat-delete.route.js +0 -36
- package/dist/features/chat/chat-post.route.d.ts +0 -11
- package/dist/features/chat/chat-post.route.js +0 -270
- package/dist/features/chat/chat-stop.route.d.ts +0 -21
- package/dist/features/chat/chat-stop.route.js +0 -22
- package/dist/features/chat/chat-subscribe.route.d.ts +0 -9
- package/dist/features/chat/chat-subscribe.route.js +0 -71
- package/dist/features/chat/chat.routes.d.ts +0 -22
- package/dist/features/chat/chat.routes.js +0 -29
- package/dist/features/conversations/conversations-delete.route.d.ts +0 -16
- package/dist/features/conversations/conversations-delete.route.js +0 -34
- package/dist/features/conversations/conversations-get-all.route.d.ts +0 -16
- package/dist/features/conversations/conversations-get-all.route.js +0 -39
- package/dist/features/conversations/conversations-get-by-id.route.d.ts +0 -16
- package/dist/features/conversations/conversations-get-by-id.route.js +0 -38
- package/dist/features/conversations/conversations-get-deleted.route.d.ts +0 -15
- package/dist/features/conversations/conversations-get-deleted.route.js +0 -34
- package/dist/features/conversations/conversations-get-messages.route.d.ts +0 -16
- package/dist/features/conversations/conversations-get-messages.route.js +0 -49
- package/dist/features/conversations/conversations.content.d.ts +0 -28
- package/dist/features/conversations/conversations.content.js +0 -142
- package/dist/features/conversations/conversations.database.d.ts +0 -108
- package/dist/features/conversations/conversations.database.js +0 -373
- package/dist/features/conversations/conversations.manager.d.ts +0 -130
- package/dist/features/conversations/conversations.manager.js +0 -162
- package/dist/features/conversations/conversations.routes.d.ts +0 -21
- package/dist/features/conversations/conversations.routes.js +0 -38
- package/dist/features/conversations/token-usage.route.d.ts +0 -41
- package/dist/features/conversations/token-usage.route.js +0 -419
- package/dist/features/git/git-commit.route.d.ts +0 -12
- package/dist/features/git/git-commit.route.js +0 -39
- package/dist/features/git/git-create-branch.route.d.ts +0 -28
- package/dist/features/git/git-create-branch.route.js +0 -119
- package/dist/features/git/git-create-pr.route.d.ts +0 -13
- package/dist/features/git/git-create-pr.route.js +0 -50
- package/dist/features/git/git-create-repo.route.d.ts +0 -14
- package/dist/features/git/git-create-repo.route.js +0 -108
- package/dist/features/git/git-diff.route.d.ts +0 -30
- package/dist/features/git/git-diff.route.js +0 -189
- package/dist/features/git/git-fetch.route.d.ts +0 -12
- package/dist/features/git/git-fetch.route.js +0 -31
- package/dist/features/git/git-generate-commit-message.route.d.ts +0 -12
- package/dist/features/git/git-generate-commit-message.route.js +0 -76
- package/dist/features/git/git-generate-pr-info.route.d.ts +0 -13
- package/dist/features/git/git-generate-pr-info.route.js +0 -147
- package/dist/features/git/git-github-status.route.d.ts +0 -16
- package/dist/features/git/git-github-status.route.js +0 -68
- package/dist/features/git/git-log.route.d.ts +0 -17
- package/dist/features/git/git-log.route.js +0 -33
- package/dist/features/git/git-pr-status.route.d.ts +0 -15
- package/dist/features/git/git-pr-status.route.js +0 -33
- package/dist/features/git/git-pull.route.d.ts +0 -12
- package/dist/features/git/git-pull.route.js +0 -35
- package/dist/features/git/git-push.route.d.ts +0 -12
- package/dist/features/git/git-push.route.js +0 -46
- package/dist/features/git/git-status-cache.database.d.ts +0 -7
- package/dist/features/git/git-status-cache.database.js +0 -53
- package/dist/features/git/git-status.route.d.ts +0 -15
- package/dist/features/git/git-status.route.js +0 -62
- package/dist/features/git/git-sync-branch.route.d.ts +0 -4
- package/dist/features/git/git-sync-branch.route.js +0 -208
- package/dist/features/git/git-unified-status.route.d.ts +0 -30
- package/dist/features/git/git-unified-status.route.js +0 -165
- package/dist/features/git/git-username.route.d.ts +0 -3
- package/dist/features/git/git-username.route.js +0 -24
- package/dist/features/git/git.manager.d.ts +0 -139
- package/dist/features/git/git.manager.js +0 -352
- package/dist/features/git/git.routes.d.ts +0 -4
- package/dist/features/git/git.routes.js +0 -116
- package/dist/features/git/git.utils.d.ts +0 -82
- package/dist/features/git/git.utils.js +0 -1040
- package/dist/features/mcp/mcp.config.d.ts +0 -27
- package/dist/features/mcp/mcp.config.js +0 -148
- package/dist/features/mcp/mcp.manager.d.ts +0 -61
- package/dist/features/mcp/mcp.manager.js +0 -254
- package/dist/features/mcp/mcp.popular.json +0 -103
- package/dist/features/mcp/mcp.routes.d.ts +0 -13
- package/dist/features/mcp/mcp.routes.js +0 -159
- package/dist/features/mcp/mcp.types.d.ts +0 -80
- package/dist/features/mcp/mcp.types.js +0 -8
- package/dist/features/metadata/metadata.manager.d.ts +0 -126
- package/dist/features/metadata/metadata.manager.js +0 -423
- package/dist/features/models/model-info-aihubmix.d.ts +0 -25
- package/dist/features/models/model-info-aihubmix.js +0 -117
- package/dist/features/models/model-info-openrouter.d.ts +0 -25
- package/dist/features/models/model-info-openrouter.js +0 -104
- package/dist/features/models/model-info.d.ts +0 -37
- package/dist/features/models/model-info.js +0 -39
- package/dist/features/models/models-catalog.d.ts +0 -49
- package/dist/features/models/models-catalog.js +0 -80
- package/dist/features/models/models-catalog.route.d.ts +0 -43
- package/dist/features/models/models-catalog.route.js +0 -15
- package/dist/features/models/models-get-available.route.d.ts +0 -36
- package/dist/features/models/models-get-available.route.js +0 -66
- package/dist/features/models/models-get-enabled.route.d.ts +0 -33
- package/dist/features/models/models-get-enabled.route.js +0 -45
- package/dist/features/models/models-get-model-info.route.d.ts +0 -31
- package/dist/features/models/models-get-model-info.route.js +0 -84
- package/dist/features/models/models-model-disable.route.d.ts +0 -15
- package/dist/features/models/models-model-disable.route.js +0 -20
- package/dist/features/models/models-model-enable.route.d.ts +0 -13
- package/dist/features/models/models-model-enable.route.js +0 -20
- package/dist/features/models/models-provider-refresh.route.d.ts +0 -17
- package/dist/features/models/models-provider-refresh.route.js +0 -20
- package/dist/features/models/models.manager.d.ts +0 -58
- package/dist/features/models/models.manager.js +0 -138
- package/dist/features/models/models.routes.d.ts +0 -18
- package/dist/features/models/models.routes.js +0 -83
- package/dist/features/models/open-router-models.d.ts +0 -38
- package/dist/features/models/open-router-models.js +0 -73
- package/dist/features/models/openai-models.d.ts +0 -63
- package/dist/features/models/openai-models.js +0 -150
- package/dist/features/onboarding/onboarding-get-git-check.route.d.ts +0 -11
- package/dist/features/onboarding/onboarding-get-git-check.route.js +0 -28
- package/dist/features/onboarding/onboarding-get-status.route.d.ts +0 -12
- package/dist/features/onboarding/onboarding-get-status.route.js +0 -15
- package/dist/features/onboarding/onboarding-post-complete.route.d.ts +0 -12
- package/dist/features/onboarding/onboarding-post-complete.route.js +0 -15
- package/dist/features/onboarding/onboarding-post-reset.route.d.ts +0 -12
- package/dist/features/onboarding/onboarding-post-reset.route.js +0 -15
- package/dist/features/onboarding/onboarding.routes.d.ts +0 -18
- package/dist/features/onboarding/onboarding.routes.js +0 -28
- package/dist/features/project-todos/project-todos.database.d.ts +0 -38
- package/dist/features/project-todos/project-todos.database.js +0 -91
- package/dist/features/project-todos/project-todos.routes.d.ts +0 -4
- package/dist/features/project-todos/project-todos.routes.js +0 -94
- package/dist/features/projects/projects-ai-files.route.d.ts +0 -148
- package/dist/features/projects/projects-ai-files.route.js +0 -425
- package/dist/features/projects/projects-commands.route.d.ts +0 -27
- package/dist/features/projects/projects-commands.route.js +0 -39
- package/dist/features/projects/projects-create.route.d.ts +0 -19
- package/dist/features/projects/projects-create.route.js +0 -37
- package/dist/features/projects/projects-delete.route.d.ts +0 -24
- package/dist/features/projects/projects-delete.route.js +0 -34
- package/dist/features/projects/projects-get.route.d.ts +0 -47
- package/dist/features/projects/projects-get.route.js +0 -36
- package/dist/features/projects/projects-list.route.d.ts +0 -58
- package/dist/features/projects/projects-list.route.js +0 -59
- package/dist/features/projects/projects-open-folder.route.d.ts +0 -10
- package/dist/features/projects/projects-open-folder.route.js +0 -11
- package/dist/features/projects/projects-open.route.d.ts +0 -26
- package/dist/features/projects/projects-open.route.js +0 -49
- package/dist/features/projects/projects-package-scripts.route.d.ts +0 -15
- package/dist/features/projects/projects-package-scripts.route.js +0 -96
- package/dist/features/projects/projects-run-command.route.d.ts +0 -8
- package/dist/features/projects/projects-run-command.route.js +0 -21
- package/dist/features/projects/projects-run.route.d.ts +0 -51
- package/dist/features/projects/projects-run.route.js +0 -74
- package/dist/features/projects/projects-update.route.d.ts +0 -24
- package/dist/features/projects/projects-update.route.js +0 -81
- package/dist/features/projects/projects.creator.d.ts +0 -33
- package/dist/features/projects/projects.creator.js +0 -555
- package/dist/features/projects/projects.database.d.ts +0 -61
- package/dist/features/projects/projects.database.js +0 -212
- package/dist/features/projects/projects.manager.d.ts +0 -291
- package/dist/features/projects/projects.manager.js +0 -426
- package/dist/features/projects/projects.open-with.d.ts +0 -27
- package/dist/features/projects/projects.open-with.js +0 -156
- package/dist/features/projects/projects.routes.d.ts +0 -20
- package/dist/features/projects/projects.routes.js +0 -255
- package/dist/features/projects/terminal-session-manager.d.ts +0 -55
- package/dist/features/projects/terminal-session-manager.js +0 -90
- package/dist/features/providers/provider-resolver.d.ts +0 -13
- package/dist/features/providers/provider-resolver.js +0 -22
- package/dist/features/providers/providers-get-credits.route.d.ts +0 -15
- package/dist/features/providers/providers-get-credits.route.js +0 -51
- package/dist/features/providers/providers-get.route.d.ts +0 -16
- package/dist/features/providers/providers-get.route.js +0 -32
- package/dist/features/providers/providers-open-external.route.d.ts +0 -15
- package/dist/features/providers/providers-open-external.route.js +0 -49
- package/dist/features/providers/providers-post-bulk-keys.route.d.ts +0 -14
- package/dist/features/providers/providers-post-bulk-keys.route.js +0 -31
- package/dist/features/providers/providers-post-keys.route.d.ts +0 -14
- package/dist/features/providers/providers-post-keys.route.js +0 -25
- package/dist/features/providers/providers.routes.d.ts +0 -19
- package/dist/features/providers/providers.routes.js +0 -31
- package/dist/features/rules/rules-post.route.d.ts +0 -43
- package/dist/features/rules/rules-post.route.js +0 -89
- package/dist/features/rules/rules.manager.d.ts +0 -36
- package/dist/features/rules/rules.manager.js +0 -203
- package/dist/features/rules/rules.routes.d.ts +0 -12
- package/dist/features/rules/rules.routes.js +0 -13
- package/dist/features/run/run-get-running.route.d.ts +0 -15
- package/dist/features/run/run-get-running.route.js +0 -21
- package/dist/features/run/run-post-start.route.d.ts +0 -8
- package/dist/features/run/run-post-start.route.js +0 -21
- package/dist/features/run/run-post-stop.route.d.ts +0 -15
- package/dist/features/run/run-post-stop.route.js +0 -24
- package/dist/features/run/run-post-suggest.route.d.ts +0 -15
- package/dist/features/run/run-post-suggest.route.js +0 -21
- package/dist/features/run/run-put-command.route.d.ts +0 -15
- package/dist/features/run/run-put-command.route.js +0 -24
- package/dist/features/run/run.routes.d.ts +0 -19
- package/dist/features/run/run.routes.js +0 -31
- package/dist/features/scaffold/index.d.ts +0 -7
- package/dist/features/scaffold/index.js +0 -5
- package/dist/features/scaffold/scaffold-get-templates.route.d.ts +0 -27
- package/dist/features/scaffold/scaffold-get-templates.route.js +0 -17
- package/dist/features/scaffold/scaffold-post.route.d.ts +0 -8
- package/dist/features/scaffold/scaffold-post.route.js +0 -30
- package/dist/features/scaffold/scaffold.routes.d.ts +0 -10
- package/dist/features/scaffold/scaffold.routes.js +0 -16
- package/dist/features/scaffold/scaffold.runner.d.ts +0 -48
- package/dist/features/scaffold/scaffold.runner.js +0 -475
- package/dist/features/scaffold/scaffold.types.d.ts +0 -26
- package/dist/features/scaffold/scaffold.types.js +0 -5
- package/dist/features/skills/skills.activation.d.ts +0 -31
- package/dist/features/skills/skills.activation.js +0 -155
- package/dist/features/skills/skills.manager.d.ts +0 -35
- package/dist/features/skills/skills.manager.js +0 -251
- package/dist/features/slash-commands/slash-commands-delete.route.d.ts +0 -23
- package/dist/features/slash-commands/slash-commands-delete.route.js +0 -36
- package/dist/features/slash-commands/slash-commands-get.route.d.ts +0 -53
- package/dist/features/slash-commands/slash-commands-get.route.js +0 -54
- package/dist/features/slash-commands/slash-commands-post.route.d.ts +0 -39
- package/dist/features/slash-commands/slash-commands-post.route.js +0 -70
- package/dist/features/slash-commands/slash-commands-put.route.d.ts +0 -23
- package/dist/features/slash-commands/slash-commands-put.route.js +0 -36
- package/dist/features/slash-commands/slash-commands.manager.d.ts +0 -46
- package/dist/features/slash-commands/slash-commands.manager.js +0 -265
- package/dist/features/slash-commands/slash-commands.routes.d.ts +0 -13
- package/dist/features/slash-commands/slash-commands.routes.js +0 -20
- package/dist/features/threads/threads-ai-files.route.d.ts +0 -153
- package/dist/features/threads/threads-ai-files.route.js +0 -287
- package/dist/features/threads/threads-conversation-folder-path.route.d.ts +0 -14
- package/dist/features/threads/threads-conversation-folder-path.route.js +0 -23
- package/dist/features/threads/threads-create.route.d.ts +0 -22
- package/dist/features/threads/threads-create.route.js +0 -60
- package/dist/features/threads/threads-delete.route.d.ts +0 -25
- package/dist/features/threads/threads-delete.route.js +0 -35
- package/dist/features/threads/threads-files.route.d.ts +0 -15
- package/dist/features/threads/threads-files.route.js +0 -20
- package/dist/features/threads/threads-fix-comments.route.d.ts +0 -26
- package/dist/features/threads/threads-fix-comments.route.js +0 -45
- package/dist/features/threads/threads-get.route.d.ts +0 -30
- package/dist/features/threads/threads-get.route.js +0 -38
- package/dist/features/threads/threads-list.route.d.ts +0 -56
- package/dist/features/threads/threads-list.route.js +0 -58
- package/dist/features/threads/threads-messages.route.d.ts +0 -28
- package/dist/features/threads/threads-messages.route.js +0 -110
- package/dist/features/threads/threads-open.route.d.ts +0 -26
- package/dist/features/threads/threads-open.route.js +0 -62
- package/dist/features/threads/threads-select.route.d.ts +0 -25
- package/dist/features/threads/threads-select.route.js +0 -35
- package/dist/features/threads/threads-update.route.d.ts +0 -15
- package/dist/features/threads/threads-update.route.js +0 -30
- package/dist/features/threads/threads.database.d.ts +0 -68
- package/dist/features/threads/threads.database.js +0 -215
- package/dist/features/threads/threads.manager.d.ts +0 -204
- package/dist/features/threads/threads.manager.js +0 -505
- package/dist/features/threads/threads.routes.d.ts +0 -20
- package/dist/features/threads/threads.routes.js +0 -230
- package/dist/features/todos/todos.database.d.ts +0 -14
- package/dist/features/todos/todos.database.js +0 -31
- package/dist/features/updates/updates.routes.d.ts +0 -13
- package/dist/features/updates/updates.routes.js +0 -40
- package/dist/index.d.ts +0 -3
- package/dist/project-analyzer.d.ts +0 -26
- package/dist/project-analyzer.js +0 -307
- package/dist/server.d.ts +0 -12
- package/dist/server.js +0 -142
- package/dist/tools/agent-tool.d.ts +0 -49
- package/dist/tools/agent-tool.js +0 -131
- package/dist/tools/ask-user.d.ts +0 -25
- package/dist/tools/ask-user.js +0 -74
- package/dist/tools/ast-grep.d.ts +0 -28
- package/dist/tools/ast-grep.js +0 -273
- package/dist/tools/bash.d.ts +0 -33
- package/dist/tools/bash.js +0 -186
- package/dist/tools/edit-diff.d.ts +0 -24
- package/dist/tools/edit-diff.js +0 -136
- package/dist/tools/edit.d.ts +0 -28
- package/dist/tools/edit.js +0 -78
- package/dist/tools/find.d.ts +0 -31
- package/dist/tools/find.js +0 -117
- package/dist/tools/grep.d.ts +0 -37
- package/dist/tools/grep.js +0 -231
- package/dist/tools/index.d.ts +0 -93
- package/dist/tools/index.js +0 -110
- package/dist/tools/ls.d.ts +0 -31
- package/dist/tools/ls.js +0 -108
- package/dist/tools/mcp-tools.d.ts +0 -31
- package/dist/tools/mcp-tools.js +0 -59
- package/dist/tools/path-utils.d.ts +0 -14
- package/dist/tools/path-utils.js +0 -87
- package/dist/tools/read.d.ts +0 -27
- package/dist/tools/read.js +0 -86
- package/dist/tools/resolve-bin.d.ts +0 -5
- package/dist/tools/resolve-bin.js +0 -28
- package/dist/tools/shell.d.ts +0 -7
- package/dist/tools/shell.js +0 -143
- package/dist/tools/skill-reference-tool.d.ts +0 -30
- package/dist/tools/skill-reference-tool.js +0 -171
- package/dist/tools/skill-tool.d.ts +0 -33
- package/dist/tools/skill-tool.js +0 -213
- package/dist/tools/todo.d.ts +0 -20
- package/dist/tools/todo.js +0 -168
- package/dist/tools/tool-helpers.d.ts +0 -78
- package/dist/tools/tool-helpers.js +0 -109
- package/dist/tools/truncate.d.ts +0 -31
- package/dist/tools/truncate.js +0 -164
- package/dist/tools/write.d.ts +0 -21
- package/dist/tools/write.js +0 -65
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ProjectManager handles project lifecycle and metadata management
|
|
3
|
-
*
|
|
4
|
-
* This manager is responsible for:
|
|
5
|
-
* - Creating new projects from git URLs
|
|
6
|
-
* - Managing project metadata
|
|
7
|
-
* - Coordinating with GitManager for repository cloning
|
|
8
|
-
* - Providing CRUD operations for projects
|
|
9
|
-
*/
|
|
10
|
-
import { join } from "path";
|
|
11
|
-
import { realpathSync } from "fs";
|
|
12
|
-
import { rm } from "fs/promises";
|
|
13
|
-
import { spawnShell } from "../../core/utils.js";
|
|
14
|
-
import { CommitMethods } from "@tarsk/shared";
|
|
15
|
-
import { ProcessManager } from "../../agent/agent.process-manager.js";
|
|
16
|
-
import { suggestRunCommand } from "../../core/run-command-detector.js";
|
|
17
|
-
import { OpenWithHandler } from "./projects.open-with.js";
|
|
18
|
-
import { ProjectCreator } from "./projects.creator.js";
|
|
19
|
-
import { TerminalSessionManager } from "./terminal-session-manager.js";
|
|
20
|
-
/**
|
|
21
|
-
* ProjectManagerImpl provides the implementation for project operations
|
|
22
|
-
*/
|
|
23
|
-
export class ProjectManagerImpl {
|
|
24
|
-
rootFolder;
|
|
25
|
-
metadataManager;
|
|
26
|
-
processManager;
|
|
27
|
-
openWithHandler;
|
|
28
|
-
projectCreator;
|
|
29
|
-
terminalSessionManager;
|
|
30
|
-
/**
|
|
31
|
-
* Create a new ProjectManager
|
|
32
|
-
* @param rootFolder - Base directory where projects will be stored
|
|
33
|
-
* @param metadataManager - Manager for persisting metadata
|
|
34
|
-
* @param gitManager - Manager for git operations
|
|
35
|
-
* @param processingStateManager - Optional manager for processing state (for spinner during clone)
|
|
36
|
-
*
|
|
37
|
-
* Requirements:
|
|
38
|
-
* - 1.1 - WHEN a user provides a git URL to create a new Project, THE CLI SHALL clone the repository into a folder under the Root_Folder
|
|
39
|
-
* - 1.4 - THE CLI SHALL determine the storage path for each Project folder
|
|
40
|
-
*/
|
|
41
|
-
constructor(rootFolder, metadataManager, gitManager, processingStateManager) {
|
|
42
|
-
this.rootFolder = rootFolder;
|
|
43
|
-
this.metadataManager = metadataManager;
|
|
44
|
-
this.processManager = new ProcessManager();
|
|
45
|
-
this.terminalSessionManager = new TerminalSessionManager();
|
|
46
|
-
this.openWithHandler = new OpenWithHandler((id) => this.getProject(id), metadataManager);
|
|
47
|
-
this.projectCreator = new ProjectCreator(rootFolder, metadataManager, gitManager, processingStateManager, {
|
|
48
|
-
suggestRunCommand: (id) => this.suggestRunCommand(id),
|
|
49
|
-
updateRunCommand: (id, cmd) => this.updateRunCommand(id, cmd),
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Creates a new project from a git URL
|
|
54
|
-
*
|
|
55
|
-
* This method:
|
|
56
|
-
* 1. Validates the git URL
|
|
57
|
-
* 2. Generates a unique project ID
|
|
58
|
-
* 3. Derives the project name from the git URL
|
|
59
|
-
* 4. Generates the project path
|
|
60
|
-
* 5. Delegates to GitManager for cloning
|
|
61
|
-
* 6. Saves project metadata
|
|
62
|
-
* 7. Yields progress events during the operation
|
|
63
|
-
* 8. Creates an initial thread automatically
|
|
64
|
-
*
|
|
65
|
-
* @param gitUrl - The git repository URL
|
|
66
|
-
* @yields ProjectEvent objects during the creation process
|
|
67
|
-
*
|
|
68
|
-
* Requirements:
|
|
69
|
-
* - 1.1 - WHEN a user provides a git URL to create a new Project, THE CLI SHALL clone the repository into a folder under the Root_Folder
|
|
70
|
-
* - 1.2 - WHEN a Project is created, THE App SHALL display the Project in the Side_Panel with its associated Thread
|
|
71
|
-
* - 1.4 - THE CLI SHALL determine the storage path for each Project folder
|
|
72
|
-
* - 1.5 - WHEN a Project folder is created, THE System SHALL associate it with the provided git URL
|
|
73
|
-
*/
|
|
74
|
-
async *createProject(gitUrl, commitMethod = CommitMethods.PullRequest) {
|
|
75
|
-
yield* this.projectCreator.createProject(gitUrl, commitMethod);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Creates a new project from a local folder via native OS dialog.
|
|
79
|
-
*/
|
|
80
|
-
async *createProjectFromFolder() {
|
|
81
|
-
yield* this.projectCreator.createProjectFromFolder();
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Creates a new project by scaffolding a web app, then git init and initial thread.
|
|
85
|
-
*/
|
|
86
|
-
async *createProjectFromScaffold(projectName, templateId, packageManager) {
|
|
87
|
-
yield* this.projectCreator.createProjectFromScaffold(projectName, templateId, packageManager);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Gets a project by ID
|
|
91
|
-
* @param projectId - The project ID
|
|
92
|
-
* @returns The project or null if not found
|
|
93
|
-
*/
|
|
94
|
-
async getProject(projectId) {
|
|
95
|
-
const projects = await this.metadataManager.loadProjects();
|
|
96
|
-
return projects.find((p) => p.id === projectId) ?? null;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Lists all projects
|
|
100
|
-
* @returns Array of all projects
|
|
101
|
-
*/
|
|
102
|
-
async listProjects() {
|
|
103
|
-
return await this.metadataManager.loadProjects();
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Deletes a project and all its threads (cascade delete)
|
|
107
|
-
*
|
|
108
|
-
* This method:
|
|
109
|
-
* 1. Finds the project by ID
|
|
110
|
-
* 2. Removes all associated threads from metadata
|
|
111
|
-
* 3. Removes the project directory from filesystem
|
|
112
|
-
* 4. Removes the project from metadata
|
|
113
|
-
*
|
|
114
|
-
* @param projectId - The project ID to delete
|
|
115
|
-
* @throws Error if project not found
|
|
116
|
-
*
|
|
117
|
-
* Requirements:
|
|
118
|
-
* - 1.1 - Cascade delete for projects (remove all threads)
|
|
119
|
-
*/
|
|
120
|
-
async deleteProject(projectId) {
|
|
121
|
-
const projects = await this.metadataManager.loadProjects();
|
|
122
|
-
const projectIndex = projects.findIndex((p) => p.id === projectId);
|
|
123
|
-
if (projectIndex === -1) {
|
|
124
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
125
|
-
}
|
|
126
|
-
const project = projects[projectIndex];
|
|
127
|
-
// Load threads and remove all threads associated with this project
|
|
128
|
-
const threads = await this.metadataManager.loadThreads();
|
|
129
|
-
const remainingThreads = threads.filter((t) => t.projectId !== projectId);
|
|
130
|
-
await this.metadataManager.saveThreads(remainingThreads);
|
|
131
|
-
// Remove project directory from filesystem
|
|
132
|
-
try {
|
|
133
|
-
await rm(project.path, { recursive: true, force: true });
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
throw new Error(`Failed to remove project directory: ${error instanceof Error ? error.message : String(error)}`);
|
|
137
|
-
}
|
|
138
|
-
// Remove project from metadata
|
|
139
|
-
projects.splice(projectIndex, 1);
|
|
140
|
-
await this.metadataManager.saveProjects(projects);
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Gets the root folder path
|
|
144
|
-
* @returns The root folder path
|
|
145
|
-
*/
|
|
146
|
-
getRootFolder() {
|
|
147
|
-
return this.rootFolder;
|
|
148
|
-
}
|
|
149
|
-
async openWith(projectId, program) {
|
|
150
|
-
return this.openWithHandler.openWith(projectId, program);
|
|
151
|
-
}
|
|
152
|
-
async updateOpenWith(projectId, program) {
|
|
153
|
-
return this.openWithHandler.updateOpenWith(projectId, program);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Saves (adds or updates) a command for a project
|
|
157
|
-
* @param projectId - The project ID
|
|
158
|
-
* @param command - The command to save
|
|
159
|
-
*/
|
|
160
|
-
async saveCommand(projectId, command) {
|
|
161
|
-
const projects = await this.metadataManager.loadProjects();
|
|
162
|
-
const projectIndex = projects.findIndex((p) => p.id === projectId);
|
|
163
|
-
if (projectIndex === -1) {
|
|
164
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
165
|
-
}
|
|
166
|
-
const project = projects[projectIndex];
|
|
167
|
-
project.commands ??= [];
|
|
168
|
-
const commandIndex = project.commands.findIndex((c) => c.id === command.id);
|
|
169
|
-
if (commandIndex !== -1) {
|
|
170
|
-
project.commands[commandIndex] = command;
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
project.commands.push(command);
|
|
174
|
-
}
|
|
175
|
-
await this.metadataManager.saveProjects(projects);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Deletes a command from a project
|
|
179
|
-
* @param projectId - The project ID
|
|
180
|
-
* @param commandId - The ID of the command to delete
|
|
181
|
-
*/
|
|
182
|
-
async deleteCommand(projectId, commandId) {
|
|
183
|
-
const projects = await this.metadataManager.loadProjects();
|
|
184
|
-
const projectIndex = projects.findIndex((p) => p.id === projectId);
|
|
185
|
-
if (projectIndex === -1) {
|
|
186
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
187
|
-
}
|
|
188
|
-
const project = projects[projectIndex];
|
|
189
|
-
if (project.commands) {
|
|
190
|
-
project.commands = project.commands.filter((c) => c.id !== commandId);
|
|
191
|
-
}
|
|
192
|
-
await this.metadataManager.saveProjects(projects);
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Updates the project's setup script
|
|
196
|
-
* @param projectId - The project ID
|
|
197
|
-
* @param setupScript - The setup script to run after clone (or null to clear)
|
|
198
|
-
*/
|
|
199
|
-
async updateSetupScript(projectId, setupScript) {
|
|
200
|
-
const projects = await this.metadataManager.loadProjects();
|
|
201
|
-
const projectIndex = projects.findIndex((p) => p.id === projectId);
|
|
202
|
-
if (projectIndex === -1) {
|
|
203
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
204
|
-
}
|
|
205
|
-
// Update the project's setup script
|
|
206
|
-
if (setupScript === null || setupScript === "") {
|
|
207
|
-
delete projects[projectIndex].setupScript;
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
projects[projectIndex].setupScript = setupScript;
|
|
211
|
-
}
|
|
212
|
-
await this.metadataManager.saveProjects(projects);
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Updates the project's name
|
|
216
|
-
* @param projectId - The project ID
|
|
217
|
-
* @param name - The new project name
|
|
218
|
-
*/
|
|
219
|
-
async updateProjectName(projectId, name) {
|
|
220
|
-
const projects = await this.metadataManager.loadProjects();
|
|
221
|
-
const projectIndex = projects.findIndex((p) => p.id === projectId);
|
|
222
|
-
if (projectIndex === -1) {
|
|
223
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
224
|
-
}
|
|
225
|
-
if (!name || typeof name !== "string" || name.trim() === "") {
|
|
226
|
-
throw new Error("Project name cannot be empty");
|
|
227
|
-
}
|
|
228
|
-
projects[projectIndex].name = name.trim();
|
|
229
|
-
await this.metadataManager.saveProjects(projects);
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Runs a command in a thread's directory
|
|
233
|
-
* @param threadId - The thread ID where to run the command
|
|
234
|
-
* @param commandLine - The command line to execute
|
|
235
|
-
* @param cwd - Optional working directory relative to thread path
|
|
236
|
-
*/
|
|
237
|
-
async *runCommand(threadId, commandLine, cwd) {
|
|
238
|
-
const threads = await this.metadataManager.loadThreads();
|
|
239
|
-
const thread = threads.find((t) => t.id === threadId);
|
|
240
|
-
if (!thread) {
|
|
241
|
-
throw new Error(`Thread not found: ${threadId}`);
|
|
242
|
-
}
|
|
243
|
-
// Get or create terminal session for this thread
|
|
244
|
-
const session = this.terminalSessionManager.getOrCreateSession(threadId, thread.path);
|
|
245
|
-
// Determine the working directory for this command
|
|
246
|
-
let workingDir;
|
|
247
|
-
if (cwd) {
|
|
248
|
-
// If explicit cwd provided, use it (absolute or relative to thread path)
|
|
249
|
-
workingDir = cwd.startsWith("/") ? cwd : join(thread.path, cwd);
|
|
250
|
-
// Update the session's working directory when explicit cwd is provided
|
|
251
|
-
this.terminalSessionManager.updateWorkingDirectory(threadId, workingDir);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
// Use the session's current working directory
|
|
255
|
-
workingDir = session.currentWorkingDirectory;
|
|
256
|
-
}
|
|
257
|
-
// Emit the current working directory so the client always has an absolute path
|
|
258
|
-
yield { type: "cwd", path: workingDir };
|
|
259
|
-
// Use shell for complex command lines
|
|
260
|
-
// Append a command to output the final working directory after the command runs
|
|
261
|
-
const child = spawnShell(`${commandLine}; printf "\n___CWD___%s\n" "$(pwd)"`, {
|
|
262
|
-
cwd: workingDir,
|
|
263
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
264
|
-
});
|
|
265
|
-
const decoder = new TextDecoder();
|
|
266
|
-
const outputBuffer = [];
|
|
267
|
-
let isDone = false;
|
|
268
|
-
if (child.stdout) {
|
|
269
|
-
child.stdout.on("data", (data) => {
|
|
270
|
-
const text = decoder.decode(data);
|
|
271
|
-
// Check if this chunk contains our CWD marker
|
|
272
|
-
if (text.includes("___CWD___")) {
|
|
273
|
-
const parts = text.split("___CWD___");
|
|
274
|
-
if (parts[0])
|
|
275
|
-
outputBuffer.push(parts[0]);
|
|
276
|
-
const newCwd = parts[1].trim();
|
|
277
|
-
if (newCwd) {
|
|
278
|
-
try {
|
|
279
|
-
const realNewCwd = realpathSync(newCwd);
|
|
280
|
-
outputBuffer.push({ type: "cwd", path: realNewCwd });
|
|
281
|
-
// Update the session's working directory when it changes
|
|
282
|
-
this.terminalSessionManager.updateWorkingDirectory(threadId, realNewCwd);
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
outputBuffer.push({ type: "cwd", path: newCwd });
|
|
286
|
-
// Update the session's working directory even if realpath fails
|
|
287
|
-
this.terminalSessionManager.updateWorkingDirectory(threadId, newCwd);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
outputBuffer.push(text);
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
if (child.stderr) {
|
|
297
|
-
child.stderr.on("data", (data) => {
|
|
298
|
-
outputBuffer.push({ type: "error", message: decoder.decode(data) });
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
child.on("close", (code) => {
|
|
302
|
-
if (code !== 0) {
|
|
303
|
-
outputBuffer.push({ type: "error", message: `Process exited with code ${code}` });
|
|
304
|
-
}
|
|
305
|
-
isDone = true;
|
|
306
|
-
});
|
|
307
|
-
child.on("error", (err) => {
|
|
308
|
-
outputBuffer.push({ type: "error", message: err.message });
|
|
309
|
-
isDone = true;
|
|
310
|
-
});
|
|
311
|
-
while (!isDone || outputBuffer.length > 0) {
|
|
312
|
-
if (outputBuffer.length > 0) {
|
|
313
|
-
yield outputBuffer.shift();
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Suggests a run command based on package.json
|
|
322
|
-
* @param projectId - The project ID
|
|
323
|
-
* @returns Suggested run command or null if none detected
|
|
324
|
-
*/
|
|
325
|
-
async suggestRunCommand(projectId) {
|
|
326
|
-
const project = await this.getProject(projectId);
|
|
327
|
-
if (!project) {
|
|
328
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
329
|
-
}
|
|
330
|
-
// Get the first thread's path where the actual repository code lives
|
|
331
|
-
// (project.path is just a container for threads)
|
|
332
|
-
const threads = await this.metadataManager.loadThreads();
|
|
333
|
-
const projectThreads = threads.filter((t) => t.projectId === projectId);
|
|
334
|
-
if (projectThreads.length === 0) {
|
|
335
|
-
return null;
|
|
336
|
-
}
|
|
337
|
-
return suggestRunCommand(projectThreads[0].path);
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Updates the project's run command
|
|
341
|
-
* @param projectId - The project ID
|
|
342
|
-
* @param runCommand - The run command (e.g., "npm run dev") or null to clear
|
|
343
|
-
*/
|
|
344
|
-
async updateRunCommand(projectId, runCommand) {
|
|
345
|
-
const projects = await this.metadataManager.loadProjects();
|
|
346
|
-
const project = projects.find((p) => p.id === projectId);
|
|
347
|
-
if (!project) {
|
|
348
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
349
|
-
}
|
|
350
|
-
project.runCommand = runCommand ?? undefined;
|
|
351
|
-
await this.metadataManager.saveProjects(projects);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Updates the project's commit method
|
|
355
|
-
* @param projectId - The project ID
|
|
356
|
-
* @param commitMethod - The commit method (PullRequest or Direct)
|
|
357
|
-
*/
|
|
358
|
-
async updateCommitMethod(projectId, commitMethod) {
|
|
359
|
-
const projects = await this.metadataManager.loadProjects();
|
|
360
|
-
const project = projects.find((p) => p.id === projectId);
|
|
361
|
-
if (!project) {
|
|
362
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
363
|
-
}
|
|
364
|
-
project.commitMethod = commitMethod;
|
|
365
|
-
await this.metadataManager.saveProjects(projects);
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* Starts running a dev server process for a project
|
|
369
|
-
* @param projectId - The project ID
|
|
370
|
-
* @yields ProcessOutput events during the process
|
|
371
|
-
*/
|
|
372
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
373
|
-
async *startRunningProcess(projectId, threadId) {
|
|
374
|
-
console.log("CLI Manager: startRunningProcess called for project:", projectId, "thread:", threadId);
|
|
375
|
-
const project = await this.getProject(projectId);
|
|
376
|
-
if (!project) {
|
|
377
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
378
|
-
}
|
|
379
|
-
if (!project.runCommand) {
|
|
380
|
-
throw new Error(`No run command defined for project: ${projectId}`);
|
|
381
|
-
}
|
|
382
|
-
// Use the provided threadId or fall back to the first thread
|
|
383
|
-
const targetThreadId = threadId ?? project.threads?.[0];
|
|
384
|
-
if (!targetThreadId) {
|
|
385
|
-
throw new Error(`No thread specified and no threads found for project: ${projectId}`);
|
|
386
|
-
}
|
|
387
|
-
try {
|
|
388
|
-
const threads = await this.metadataManager.loadThreads();
|
|
389
|
-
const thread = threads.find((t) => t.id === targetThreadId);
|
|
390
|
-
if (!thread) {
|
|
391
|
-
console.warn("[start-running-process] Thread not found for project", projectId, "targetThreadId:", targetThreadId, "available:", project.threads);
|
|
392
|
-
throw new Error(`Thread not found for project: ${projectId} with threadId: ${targetThreadId}`);
|
|
393
|
-
}
|
|
394
|
-
console.log("[start-running-process] Starting process with command:", project.runCommand, "in thread path:", thread.path);
|
|
395
|
-
yield* this.processManager.runProcess(projectId, project.runCommand, thread.path, targetThreadId);
|
|
396
|
-
}
|
|
397
|
-
catch (error) {
|
|
398
|
-
console.error("[start-running-process] Error starting process:", error);
|
|
399
|
-
throw error;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Stops a running dev server process for a project
|
|
404
|
-
* @param projectId - The project ID
|
|
405
|
-
* @returns true if process was stopped, false if no process was running
|
|
406
|
-
*/
|
|
407
|
-
async stopRunningProcess(projectId) {
|
|
408
|
-
// Try to get the thread ID for this project to clear the cache
|
|
409
|
-
const project = await this.getProject(projectId);
|
|
410
|
-
let threadId;
|
|
411
|
-
if (project) {
|
|
412
|
-
// Use the first thread associated with this project
|
|
413
|
-
threadId = project.threads?.[0];
|
|
414
|
-
}
|
|
415
|
-
return this.processManager.stopProcess(projectId, threadId);
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Checks if a process is running for a project
|
|
419
|
-
* @param projectId - The project ID
|
|
420
|
-
* @returns true if a process is running
|
|
421
|
-
*/
|
|
422
|
-
async isProcessRunning(projectId) {
|
|
423
|
-
return this.processManager.isRunning(projectId);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
//# sourceMappingURL=projects.manager.js.map
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Open-with: open a project in an external program (Cursor, VS Code, Terminal, etc.)
|
|
3
|
-
* and persist the project's open-with preference.
|
|
4
|
-
*/
|
|
5
|
-
import type { Project } from "@tarsk/shared";
|
|
6
|
-
import type { MetadataManager } from "../metadata/metadata.manager.js";
|
|
7
|
-
/**
|
|
8
|
-
* Validates if a program is supported.
|
|
9
|
-
* Returns null if valid, or an error message if invalid.
|
|
10
|
-
*/
|
|
11
|
-
export declare function validateProgram(program: string | undefined): string | null;
|
|
12
|
-
export type GetProject = (projectId: string) => Promise<Project | null>;
|
|
13
|
-
/**
|
|
14
|
-
* Handles opening a project in an external program and updating the open-with preference.
|
|
15
|
-
*/
|
|
16
|
-
export declare class OpenWithHandler {
|
|
17
|
-
private getProject;
|
|
18
|
-
private metadataManager;
|
|
19
|
-
constructor(getProject: GetProject, metadataManager: MetadataManager);
|
|
20
|
-
openWith(projectId: string, program: string): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Opens the OS default terminal in the specified directory.
|
|
23
|
-
*/
|
|
24
|
-
private openTerminal;
|
|
25
|
-
updateOpenWith(projectId: string, program: string): Promise<void>;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=projects.open-with.d.ts.map
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Open-with: open a project in an external program (Cursor, VS Code, Terminal, etc.)
|
|
3
|
-
* and persist the project's open-with preference.
|
|
4
|
-
*/
|
|
5
|
-
import { spawnProcess } from "../../core/utils.js";
|
|
6
|
-
import open from "open";
|
|
7
|
-
import { AVAILABLE_PROGRAMS, PROGRAM_APP_NAMES } from "@tarsk/shared";
|
|
8
|
-
/**
|
|
9
|
-
* Validates if a program is supported.
|
|
10
|
-
* Returns null if valid, or an error message if invalid.
|
|
11
|
-
*/
|
|
12
|
-
export function validateProgram(program) {
|
|
13
|
-
if (!program) {
|
|
14
|
-
return "Program is required";
|
|
15
|
-
}
|
|
16
|
-
if (!AVAILABLE_PROGRAMS.includes(program)) {
|
|
17
|
-
return `Invalid program. Must be one of: ${AVAILABLE_PROGRAMS.join(", ")}`;
|
|
18
|
-
}
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Handles opening a project in an external program and updating the open-with preference.
|
|
23
|
-
*/
|
|
24
|
-
export class OpenWithHandler {
|
|
25
|
-
getProject;
|
|
26
|
-
metadataManager;
|
|
27
|
-
constructor(getProject, metadataManager) {
|
|
28
|
-
this.getProject = getProject;
|
|
29
|
-
this.metadataManager = metadataManager;
|
|
30
|
-
}
|
|
31
|
-
async openWith(projectId, program) {
|
|
32
|
-
console.log("[openWith] Request: projectId=%s program=%s", projectId, program);
|
|
33
|
-
const programError = validateProgram(program);
|
|
34
|
-
if (programError) {
|
|
35
|
-
throw new Error(programError);
|
|
36
|
-
}
|
|
37
|
-
const project = await this.getProject(projectId);
|
|
38
|
-
if (!project) {
|
|
39
|
-
console.error("[openWith] Project not found:", projectId);
|
|
40
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
41
|
-
}
|
|
42
|
-
const projectPath = project.path;
|
|
43
|
-
console.log(`[ai] Open with ${program}`);
|
|
44
|
-
if (program === "Terminal") {
|
|
45
|
-
await this.openTerminal(projectPath);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const appNames = PROGRAM_APP_NAMES[program];
|
|
49
|
-
if (!appNames) {
|
|
50
|
-
throw new Error(`Unsupported program: ${program}`);
|
|
51
|
-
}
|
|
52
|
-
console.log("[openWith] projectPath=%s platform=%s app=%j", projectPath, process.platform, appNames);
|
|
53
|
-
try {
|
|
54
|
-
await open(projectPath, {
|
|
55
|
-
app: { name: appNames },
|
|
56
|
-
});
|
|
57
|
-
console.log("[openWith] open() completed successfully");
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
61
|
-
console.error("[openWith] open() error:", message);
|
|
62
|
-
throw new Error(`Failed to open ${program}: ${message}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Opens the OS default terminal in the specified directory.
|
|
67
|
-
*/
|
|
68
|
-
async openTerminal(projectPath) {
|
|
69
|
-
console.log("[openTerminal] Starting terminal launch...");
|
|
70
|
-
console.log("[openTerminal] Platform:", process.platform);
|
|
71
|
-
console.log("[openTerminal] Project path:", projectPath);
|
|
72
|
-
try {
|
|
73
|
-
if (process.platform === "darwin") {
|
|
74
|
-
console.log("[openTerminal] Detected macOS - spawning sh with open command");
|
|
75
|
-
const child = spawnProcess("sh", ["-c", `open -a Terminal '${projectPath}'`], {
|
|
76
|
-
detached: true,
|
|
77
|
-
stdio: "ignore",
|
|
78
|
-
});
|
|
79
|
-
console.log("[openTerminal] Spawn returned, pid:", child.pid);
|
|
80
|
-
child.unref();
|
|
81
|
-
console.log("[openTerminal] macOS Terminal opened successfully");
|
|
82
|
-
}
|
|
83
|
-
else if (process.platform === "linux") {
|
|
84
|
-
console.log("[openTerminal] Detected Linux - trying terminal emulators");
|
|
85
|
-
const terminals = [
|
|
86
|
-
{
|
|
87
|
-
cmd: "gnome-terminal",
|
|
88
|
-
args: ["--working-directory=" + projectPath],
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
cmd: "xfce4-terminal",
|
|
92
|
-
args: ["--working-directory=" + projectPath],
|
|
93
|
-
},
|
|
94
|
-
{ cmd: "konsole", args: ["--workdir", projectPath] },
|
|
95
|
-
{ cmd: "xterm", args: ["-e", `sh -c 'cd "${projectPath}" && bash'`] },
|
|
96
|
-
];
|
|
97
|
-
let opened = false;
|
|
98
|
-
for (const terminal of terminals) {
|
|
99
|
-
try {
|
|
100
|
-
console.log("[openTerminal] Attempting to spawn:", terminal.cmd);
|
|
101
|
-
const child = spawnProcess(terminal.cmd, terminal.args, {
|
|
102
|
-
detached: true,
|
|
103
|
-
stdio: "ignore",
|
|
104
|
-
});
|
|
105
|
-
console.log("[openTerminal] Spawn returned, pid:", child.pid);
|
|
106
|
-
child.unref();
|
|
107
|
-
console.log("[openTerminal] Linux terminal opened with:", terminal.cmd);
|
|
108
|
-
opened = true;
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
console.log("[openTerminal] Failed to open with", terminal.cmd, ":", err instanceof Error ? err.message : String(err));
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (!opened) {
|
|
117
|
-
throw new Error("No supported terminal found (gnome-terminal, xfce4-terminal, konsole, or xterm required)");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
else if (process.platform === "win32") {
|
|
121
|
-
console.log("[openTerminal] Detected Windows - spawning cmd.exe");
|
|
122
|
-
const child = spawnProcess("cmd.exe", ["/k", `cd /d "${projectPath}"`], {
|
|
123
|
-
detached: true,
|
|
124
|
-
stdio: "ignore",
|
|
125
|
-
shell: true,
|
|
126
|
-
});
|
|
127
|
-
console.log("[openTerminal] Spawn returned, pid:", child.pid);
|
|
128
|
-
child.unref();
|
|
129
|
-
console.log("[openTerminal] Windows terminal opened successfully");
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
throw new Error(`Unsupported platform: ${process.platform}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
137
|
-
console.error("[openTerminal] Fatal error:", message);
|
|
138
|
-
console.error("[openTerminal] Error stack:", error instanceof Error ? error.stack : "No stack trace");
|
|
139
|
-
throw new Error(`Failed to open terminal: ${message}`);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
async updateOpenWith(projectId, program) {
|
|
143
|
-
const programError = validateProgram(program);
|
|
144
|
-
if (programError) {
|
|
145
|
-
throw new Error(programError);
|
|
146
|
-
}
|
|
147
|
-
const projects = await this.metadataManager.loadProjects();
|
|
148
|
-
const projectIndex = projects.findIndex((p) => p.id === projectId);
|
|
149
|
-
if (projectIndex === -1) {
|
|
150
|
-
throw new Error(`Project not found: ${projectId}`);
|
|
151
|
-
}
|
|
152
|
-
projects[projectIndex].openWith = program;
|
|
153
|
-
await this.metadataManager.saveProjects(projects);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=projects.open-with.js.map
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project routes for the REST API
|
|
3
|
-
*
|
|
4
|
-
* Handles all project-related operations:
|
|
5
|
-
* - POST /api/projects - Create a new project
|
|
6
|
-
* - GET /api/projects - List all projects
|
|
7
|
-
* - GET /api/projects/:id - Get project details
|
|
8
|
-
* - DELETE /api/projects/:id - Delete a project
|
|
9
|
-
*/
|
|
10
|
-
import { Hono } from "hono";
|
|
11
|
-
import { ProjectManager } from "../projects/projects.manager.js";
|
|
12
|
-
import { ThreadManager } from "../threads/threads.manager.js";
|
|
13
|
-
/**
|
|
14
|
-
* Creates project routes
|
|
15
|
-
* @param projectManager - The ProjectManager instance
|
|
16
|
-
* @param threadManager - The ThreadManager instance
|
|
17
|
-
* @returns Hono router with project routes
|
|
18
|
-
*/
|
|
19
|
-
export declare function createProjectRoutes(projectManager: ProjectManager, threadManager: ThreadManager): Hono;
|
|
20
|
-
//# sourceMappingURL=projects.routes.d.ts.map
|