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,425 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI Files routes for the REST API
|
|
3
|
-
*
|
|
4
|
-
* Handles listing and editing AI-related files in a project:
|
|
5
|
-
* - GET /api/projects/:id/ai-files - List AI file tree (skills, rules, commands, markdown files)
|
|
6
|
-
* - GET /api/projects/:id/ai-file?path=... - Read file content
|
|
7
|
-
* - PUT /api/projects/:id/ai-file - Write file content
|
|
8
|
-
* - DELETE /api/projects/:id/ai-file?path=... - Delete file or folder
|
|
9
|
-
* - POST /api/projects/:id/ai-files/skill - Create a new skill
|
|
10
|
-
*/
|
|
11
|
-
import { readdir, readFile, writeFile, mkdir, access, rm } from "fs/promises";
|
|
12
|
-
import { join, extname, basename } from "path";
|
|
13
|
-
import { existsSync } from "fs";
|
|
14
|
-
import { errorResponse } from "../../core/route-helpers.js";
|
|
15
|
-
import { ErrorCodes } from "../../core/error-responses.js";
|
|
16
|
-
const IGNORED_DIRS = new Set([
|
|
17
|
-
".git",
|
|
18
|
-
"node_modules",
|
|
19
|
-
".tarsk",
|
|
20
|
-
"dist",
|
|
21
|
-
"build",
|
|
22
|
-
".next",
|
|
23
|
-
"__pycache__",
|
|
24
|
-
".venv",
|
|
25
|
-
"venv",
|
|
26
|
-
]);
|
|
27
|
-
const MARKDOWN_EXTS = new Set([".md", ".mdc"]);
|
|
28
|
-
/**
|
|
29
|
-
* Recursively build a full file tree for a directory (all files).
|
|
30
|
-
* Used for .agents/ subfolders.
|
|
31
|
-
*/
|
|
32
|
-
async function buildFullTree(dirPath, relativeDirPath) {
|
|
33
|
-
const nodes = [];
|
|
34
|
-
try {
|
|
35
|
-
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
36
|
-
for (const entry of entries) {
|
|
37
|
-
const entryRelPath = join(relativeDirPath, entry.name);
|
|
38
|
-
const entryAbsPath = join(dirPath, entry.name);
|
|
39
|
-
if (entry.isDirectory()) {
|
|
40
|
-
const children = await buildFullTree(entryAbsPath, entryRelPath);
|
|
41
|
-
nodes.push({
|
|
42
|
-
id: entryRelPath,
|
|
43
|
-
name: entry.name,
|
|
44
|
-
type: "folder",
|
|
45
|
-
path: entryRelPath,
|
|
46
|
-
children,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
else if (entry.isFile()) {
|
|
50
|
-
nodes.push({
|
|
51
|
-
id: entryRelPath,
|
|
52
|
-
name: entry.name,
|
|
53
|
-
type: "file",
|
|
54
|
-
path: entryRelPath,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Directory doesn't exist or can't be read
|
|
61
|
-
}
|
|
62
|
-
return nodes;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Recursively find folders that contain markdown files, building a filtered tree.
|
|
66
|
-
* Returns nodes for folders containing .md/.mdc files and the .md/.mdc files themselves.
|
|
67
|
-
*/
|
|
68
|
-
async function buildMarkdownFilteredTree(dirPath, relativeDirPath) {
|
|
69
|
-
const nodes = [];
|
|
70
|
-
try {
|
|
71
|
-
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
72
|
-
for (const entry of entries) {
|
|
73
|
-
const entryRelPath = join(relativeDirPath, entry.name);
|
|
74
|
-
const entryAbsPath = join(dirPath, entry.name);
|
|
75
|
-
if (entry.isDirectory()) {
|
|
76
|
-
if (IGNORED_DIRS.has(entry.name))
|
|
77
|
-
continue;
|
|
78
|
-
const children = await buildMarkdownFilteredTree(entryAbsPath, entryRelPath);
|
|
79
|
-
if (children.length > 0) {
|
|
80
|
-
nodes.push({
|
|
81
|
-
id: entryRelPath,
|
|
82
|
-
name: entry.name,
|
|
83
|
-
type: "folder",
|
|
84
|
-
path: entryRelPath,
|
|
85
|
-
children,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else if (entry.isFile() && MARKDOWN_EXTS.has(extname(entry.name))) {
|
|
90
|
-
nodes.push({
|
|
91
|
-
id: entryRelPath,
|
|
92
|
-
name: basename(entry.name, extname(entry.name)),
|
|
93
|
-
type: "file",
|
|
94
|
-
path: entryRelPath,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
// Directory doesn't exist or can't be read
|
|
101
|
-
}
|
|
102
|
-
return nodes;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Build the full AI file tree for a project or thread.
|
|
106
|
-
* - Always shows .agents/skills, .agents/rules, .agents/commands (virtual if missing)
|
|
107
|
-
* - Shows markdown files at root level
|
|
108
|
-
* - Shows folders that contain markdown files
|
|
109
|
-
*/
|
|
110
|
-
export async function buildAIFileTree(projectPath) {
|
|
111
|
-
const nodes = [];
|
|
112
|
-
// 1. Always-shown .agents subfolders
|
|
113
|
-
const agentsFolders = [
|
|
114
|
-
{ key: "skills", label: "Skills" },
|
|
115
|
-
{ key: "rules", label: "Rules" },
|
|
116
|
-
{ key: "commands", label: "Commands" },
|
|
117
|
-
{ key: "agents", label: "Agents" },
|
|
118
|
-
];
|
|
119
|
-
for (const { key, label } of agentsFolders) {
|
|
120
|
-
const relPath = join(".agents", key);
|
|
121
|
-
const absPath = join(projectPath, relPath);
|
|
122
|
-
const exists = existsSync(absPath);
|
|
123
|
-
if (exists) {
|
|
124
|
-
const children = await buildFullTree(absPath, relPath);
|
|
125
|
-
nodes.push({
|
|
126
|
-
id: relPath,
|
|
127
|
-
name: label,
|
|
128
|
-
type: "folder",
|
|
129
|
-
path: relPath,
|
|
130
|
-
children,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
nodes.push({
|
|
135
|
-
id: relPath,
|
|
136
|
-
name: label,
|
|
137
|
-
type: "folder",
|
|
138
|
-
path: relPath,
|
|
139
|
-
children: [],
|
|
140
|
-
virtual: true,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// 2. Always add AGENTS.md as a virtual file in root
|
|
145
|
-
nodes.push({
|
|
146
|
-
id: "AGENTS.md",
|
|
147
|
-
name: "AGENTS",
|
|
148
|
-
type: "file",
|
|
149
|
-
path: "AGENTS.md",
|
|
150
|
-
virtual: true,
|
|
151
|
-
});
|
|
152
|
-
// 3. Scan root for markdown files and folders containing markdown files
|
|
153
|
-
try {
|
|
154
|
-
const rootEntries = await readdir(projectPath, { withFileTypes: true });
|
|
155
|
-
for (const entry of rootEntries) {
|
|
156
|
-
// Skip .agents (already handled), AGENTS.md (already added as virtual), and other ignored dirs
|
|
157
|
-
if (entry.name === ".agents" || entry.name === "AGENTS.md" || IGNORED_DIRS.has(entry.name))
|
|
158
|
-
continue;
|
|
159
|
-
const entryRelPath = entry.name;
|
|
160
|
-
const entryAbsPath = join(projectPath, entry.name);
|
|
161
|
-
if (entry.isFile() && MARKDOWN_EXTS.has(extname(entry.name))) {
|
|
162
|
-
nodes.push({
|
|
163
|
-
id: entryRelPath,
|
|
164
|
-
name: basename(entry.name, extname(entry.name)),
|
|
165
|
-
type: "file",
|
|
166
|
-
path: entryRelPath,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else if (entry.isDirectory()) {
|
|
170
|
-
const children = await buildMarkdownFilteredTree(entryAbsPath, entryRelPath);
|
|
171
|
-
if (children.length > 0) {
|
|
172
|
-
nodes.push({
|
|
173
|
-
id: entryRelPath,
|
|
174
|
-
name: entry.name,
|
|
175
|
-
type: "folder",
|
|
176
|
-
path: entryRelPath,
|
|
177
|
-
children,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
catch {
|
|
184
|
-
// Can't read root directory
|
|
185
|
-
}
|
|
186
|
-
return nodes;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Validate that a file path is safe (no path traversal, within project or thread)
|
|
190
|
-
*/
|
|
191
|
-
export function validateFilePath(projectPath, filePath) {
|
|
192
|
-
if (!filePath)
|
|
193
|
-
return null;
|
|
194
|
-
const abs = join(projectPath, filePath);
|
|
195
|
-
if (!abs.startsWith(projectPath + "/") && abs !== projectPath)
|
|
196
|
-
return null;
|
|
197
|
-
return abs;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* GET /api/projects/:id/ai-files
|
|
201
|
-
*/
|
|
202
|
-
export async function handleGetAIFiles(c, projectManager) {
|
|
203
|
-
try {
|
|
204
|
-
const projectId = c.req.param("id");
|
|
205
|
-
const project = await projectManager.getProject(projectId);
|
|
206
|
-
if (!project) {
|
|
207
|
-
return errorResponse(c, ErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${projectId}`, 404);
|
|
208
|
-
}
|
|
209
|
-
const nodes = await buildAIFileTree(project.path);
|
|
210
|
-
return c.json({ nodes });
|
|
211
|
-
}
|
|
212
|
-
catch (error) {
|
|
213
|
-
return errorResponse(c, ErrorCodes.INTERNAL_ERROR, "Failed to list AI files", 500, error instanceof Error ? error.message : String(error));
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* GET /api/projects/:id/ai-file?path=...
|
|
218
|
-
*/
|
|
219
|
-
export async function handleGetAIFile(c, projectManager) {
|
|
220
|
-
try {
|
|
221
|
-
const projectId = c.req.param("id");
|
|
222
|
-
const filePath = c.req.query("path");
|
|
223
|
-
if (!filePath) {
|
|
224
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "path query parameter is required" } }, 400);
|
|
225
|
-
}
|
|
226
|
-
const project = await projectManager.getProject(projectId);
|
|
227
|
-
if (!project) {
|
|
228
|
-
return errorResponse(c, ErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${projectId}`, 404);
|
|
229
|
-
}
|
|
230
|
-
const absPath = validateFilePath(project.path, filePath);
|
|
231
|
-
if (!absPath) {
|
|
232
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "Invalid file path" } }, 400);
|
|
233
|
-
}
|
|
234
|
-
// Special handling for AGENTS.md - return default content if it doesn't exist
|
|
235
|
-
if (filePath === "AGENTS.md") {
|
|
236
|
-
try {
|
|
237
|
-
await access(absPath);
|
|
238
|
-
}
|
|
239
|
-
catch {
|
|
240
|
-
// File doesn't exist, return default content
|
|
241
|
-
const defaultContent = `# AGENTS.md
|
|
242
|
-
|
|
243
|
-
This file contains configuration and instructions for AI agents working on this repository.
|
|
244
|
-
|
|
245
|
-
## Overview
|
|
246
|
-
Add information about your project that would be helpful for AI agents to understand:
|
|
247
|
-
|
|
248
|
-
- Project purpose and goals
|
|
249
|
-
- Architecture and technology stack
|
|
250
|
-
- Development workflows and conventions
|
|
251
|
-
- Testing strategies
|
|
252
|
-
- Deployment processes
|
|
253
|
-
|
|
254
|
-
## Guidelines
|
|
255
|
-
Provide specific guidelines for AI agents:
|
|
256
|
-
|
|
257
|
-
- Code style preferences
|
|
258
|
-
- File organization patterns
|
|
259
|
-
- Review processes
|
|
260
|
-
- Communication protocols
|
|
261
|
-
|
|
262
|
-
## Resources
|
|
263
|
-
Links to important documentation, tools, or references.
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
*This file was automatically created. Edit it to provide context for AI agents.*
|
|
268
|
-
`;
|
|
269
|
-
return c.json({ content: defaultContent, path: filePath });
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
try {
|
|
273
|
-
await access(absPath);
|
|
274
|
-
}
|
|
275
|
-
catch {
|
|
276
|
-
return c.json({ error: { code: "NOT_FOUND", message: `File not found: ${filePath}` } }, 404);
|
|
277
|
-
}
|
|
278
|
-
const content = await readFile(absPath, "utf-8");
|
|
279
|
-
return c.json({ content, path: filePath });
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
return errorResponse(c, ErrorCodes.INTERNAL_ERROR, "Failed to read file", 500, error instanceof Error ? error.message : String(error));
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* PUT /api/projects/:id/ai-file
|
|
287
|
-
* Body: { path: string, content: string }
|
|
288
|
-
*/
|
|
289
|
-
export async function handleSaveAIFile(c, projectManager) {
|
|
290
|
-
try {
|
|
291
|
-
const projectId = c.req.param("id");
|
|
292
|
-
let body;
|
|
293
|
-
try {
|
|
294
|
-
body = await c.req.json();
|
|
295
|
-
}
|
|
296
|
-
catch {
|
|
297
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "Invalid JSON body" } }, 400);
|
|
298
|
-
}
|
|
299
|
-
const { path: filePath, content } = body;
|
|
300
|
-
if (!filePath || content === undefined) {
|
|
301
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "path and content are required" } }, 400);
|
|
302
|
-
}
|
|
303
|
-
const project = await projectManager.getProject(projectId);
|
|
304
|
-
if (!project) {
|
|
305
|
-
return errorResponse(c, ErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${projectId}`, 404);
|
|
306
|
-
}
|
|
307
|
-
const absPath = validateFilePath(project.path, filePath);
|
|
308
|
-
if (!absPath) {
|
|
309
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "Invalid file path" } }, 400);
|
|
310
|
-
}
|
|
311
|
-
// Ensure parent directory exists
|
|
312
|
-
const parentDir = join(absPath, "..");
|
|
313
|
-
await mkdir(parentDir, { recursive: true });
|
|
314
|
-
await writeFile(absPath, content, "utf-8");
|
|
315
|
-
return c.json({ success: true, path: filePath });
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
return errorResponse(c, ErrorCodes.INTERNAL_ERROR, "Failed to save file", 500, error instanceof Error ? error.message : String(error));
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* DELETE /api/projects/:id/ai-file?path=...
|
|
323
|
-
* Deletes a file or folder at the specified path
|
|
324
|
-
*/
|
|
325
|
-
export async function handleDeleteAIFile(c, projectManager) {
|
|
326
|
-
try {
|
|
327
|
-
const projectId = c.req.param("id");
|
|
328
|
-
const filePath = c.req.query("path");
|
|
329
|
-
if (!filePath) {
|
|
330
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "path query parameter is required" } }, 400);
|
|
331
|
-
}
|
|
332
|
-
const project = await projectManager.getProject(projectId);
|
|
333
|
-
if (!project) {
|
|
334
|
-
return errorResponse(c, ErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${projectId}`, 404);
|
|
335
|
-
}
|
|
336
|
-
const absPath = validateFilePath(project.path, filePath);
|
|
337
|
-
if (!absPath) {
|
|
338
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "Invalid file path" } }, 400);
|
|
339
|
-
}
|
|
340
|
-
try {
|
|
341
|
-
await access(absPath);
|
|
342
|
-
}
|
|
343
|
-
catch {
|
|
344
|
-
return c.json({ error: { code: "NOT_FOUND", message: `File or folder not found: ${filePath}` } }, 404);
|
|
345
|
-
}
|
|
346
|
-
// Delete file or folder recursively
|
|
347
|
-
await rm(absPath, { recursive: true, force: true });
|
|
348
|
-
return c.json({ success: true, path: filePath });
|
|
349
|
-
}
|
|
350
|
-
catch (error) {
|
|
351
|
-
return errorResponse(c, ErrorCodes.INTERNAL_ERROR, "Failed to delete file", 500, error instanceof Error ? error.message : String(error));
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* POST /api/projects/:id/ai-files/skill
|
|
356
|
-
* Body: { name: string, description: string, isGlobal?: boolean }
|
|
357
|
-
* Creates .agents/skills/{name}/SKILL.md
|
|
358
|
-
*/
|
|
359
|
-
export async function handleCreateSkill(c, projectManager) {
|
|
360
|
-
try {
|
|
361
|
-
const projectId = c.req.param("id");
|
|
362
|
-
let body;
|
|
363
|
-
try {
|
|
364
|
-
body = await c.req.json();
|
|
365
|
-
}
|
|
366
|
-
catch {
|
|
367
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "Invalid JSON body" } }, 400);
|
|
368
|
-
}
|
|
369
|
-
const { name, description, isGlobal } = body;
|
|
370
|
-
if (!name || !description) {
|
|
371
|
-
return c.json({ error: { code: "BAD_REQUEST", message: "name and description are required" } }, 400);
|
|
372
|
-
}
|
|
373
|
-
// Validate name: lowercase, alphanumeric and hyphens only
|
|
374
|
-
if (!/^[a-z0-9-]+$/.test(name) ||
|
|
375
|
-
name.startsWith("-") ||
|
|
376
|
-
name.endsWith("-") ||
|
|
377
|
-
name.includes("--")) {
|
|
378
|
-
return c.json({
|
|
379
|
-
error: {
|
|
380
|
-
code: "BAD_REQUEST",
|
|
381
|
-
message: "Skill name must be lowercase alphanumeric with hyphens (no leading/trailing/consecutive hyphens)",
|
|
382
|
-
},
|
|
383
|
-
}, 400);
|
|
384
|
-
}
|
|
385
|
-
if (isGlobal) {
|
|
386
|
-
return c.json({
|
|
387
|
-
error: {
|
|
388
|
-
code: "BAD_REQUEST",
|
|
389
|
-
message: "Global skills are not yet supported via this endpoint",
|
|
390
|
-
},
|
|
391
|
-
}, 400);
|
|
392
|
-
}
|
|
393
|
-
const project = await projectManager.getProject(projectId);
|
|
394
|
-
if (!project) {
|
|
395
|
-
return errorResponse(c, ErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${projectId}`, 404);
|
|
396
|
-
}
|
|
397
|
-
const skillRelPath = join(".agents", "skills", name);
|
|
398
|
-
const skillAbsPath = join(project.path, skillRelPath);
|
|
399
|
-
const skillFileRelPath = join(skillRelPath, "SKILL.md");
|
|
400
|
-
const skillFileAbsPath = join(skillAbsPath, "SKILL.md");
|
|
401
|
-
// Check skill doesn't already exist
|
|
402
|
-
if (existsSync(skillAbsPath)) {
|
|
403
|
-
return c.json({ error: { code: "CONFLICT", message: `Skill '${name}' already exists` } }, 409);
|
|
404
|
-
}
|
|
405
|
-
// Create skill directory and SKILL.md
|
|
406
|
-
await mkdir(skillAbsPath, { recursive: true });
|
|
407
|
-
const skillContent = `---
|
|
408
|
-
name: ${name}
|
|
409
|
-
description: ${description}
|
|
410
|
-
---
|
|
411
|
-
|
|
412
|
-
Place your skill instructions here as markdown. This will be used when Tarsk is prompted with a request related to the description of this skill.
|
|
413
|
-
`;
|
|
414
|
-
await writeFile(skillFileAbsPath, skillContent, "utf-8");
|
|
415
|
-
return c.json({
|
|
416
|
-
success: true,
|
|
417
|
-
path: skillFileRelPath,
|
|
418
|
-
content: skillContent,
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
catch (error) {
|
|
422
|
-
return errorResponse(c, ErrorCodes.INTERNAL_ERROR, "Failed to create skill", 500, error instanceof Error ? error.message : String(error));
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
//# sourceMappingURL=projects-ai-files.route.js.map
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* POST /api/projects/:id/commands
|
|
3
|
-
* Add or update a command for a project
|
|
4
|
-
*/
|
|
5
|
-
import { Context } from "hono";
|
|
6
|
-
import { ProjectManager } from "../projects/projects.manager.js";
|
|
7
|
-
export declare function handleSaveCommand(c: Context, projectManager: ProjectManager): Promise<(Response & import("hono").TypedResponse<{
|
|
8
|
-
error: {
|
|
9
|
-
code: string;
|
|
10
|
-
message: string;
|
|
11
|
-
details?: import("hono/utils/types").JSONValue | undefined;
|
|
12
|
-
timestamp: string;
|
|
13
|
-
};
|
|
14
|
-
}, any, "json">) | (Response & import("hono").TypedResponse<import("hono/utils/types").JSONValue, any, "json">)>;
|
|
15
|
-
/**
|
|
16
|
-
* DELETE /api/projects/:id/commands/:commandId
|
|
17
|
-
* Delete a command from a project
|
|
18
|
-
*/
|
|
19
|
-
export declare function handleDeleteCommand(c: Context, projectManager: ProjectManager): Promise<(Response & import("hono").TypedResponse<{
|
|
20
|
-
error: {
|
|
21
|
-
code: string;
|
|
22
|
-
message: string;
|
|
23
|
-
details?: import("hono/utils/types").JSONValue | undefined;
|
|
24
|
-
timestamp: string;
|
|
25
|
-
};
|
|
26
|
-
}, any, "json">) | (Response & import("hono").TypedResponse<import("hono/utils/types").JSONValue, any, "json">)>;
|
|
27
|
-
//# sourceMappingURL=projects-commands.route.d.ts.map
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* POST /api/projects/:id/commands
|
|
3
|
-
* Add or update a command for a project
|
|
4
|
-
*/
|
|
5
|
-
import { errorResponse, successResponse } from "../../core/route-helpers.js";
|
|
6
|
-
import { ErrorCodes } from "../../core/error-responses.js";
|
|
7
|
-
export async function handleSaveCommand(c, projectManager) {
|
|
8
|
-
try {
|
|
9
|
-
const projectId = c.req.param("id");
|
|
10
|
-
const command = await c.req.json();
|
|
11
|
-
if (!projectId) {
|
|
12
|
-
return errorResponse(c, ErrorCodes.INVALID_REQUEST, "Project ID is required", 400);
|
|
13
|
-
}
|
|
14
|
-
await projectManager.saveCommand(projectId, command);
|
|
15
|
-
return successResponse(c, { success: true, message: "Command saved" });
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
return errorResponse(c, ErrorCodes.SAVE_COMMAND_ERROR, "Failed to save command", 500, error instanceof Error ? error.message : String(error));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* DELETE /api/projects/:id/commands/:commandId
|
|
23
|
-
* Delete a command from a project
|
|
24
|
-
*/
|
|
25
|
-
export async function handleDeleteCommand(c, projectManager) {
|
|
26
|
-
try {
|
|
27
|
-
const projectId = c.req.param("id");
|
|
28
|
-
const commandId = c.req.param("commandId");
|
|
29
|
-
if (!projectId || !commandId) {
|
|
30
|
-
return errorResponse(c, ErrorCodes.INVALID_REQUEST, "Project ID and Command ID are required", 400);
|
|
31
|
-
}
|
|
32
|
-
await projectManager.deleteCommand(projectId, commandId);
|
|
33
|
-
return successResponse(c, { success: true, message: "Command deleted" });
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
return errorResponse(c, ErrorCodes.DELETE_COMMAND_ERROR, "Failed to delete command", 500, error instanceof Error ? error.message : String(error));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=projects-commands.route.js.map
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* POST /api/projects
|
|
3
|
-
* Create a new project from a git URL
|
|
4
|
-
*
|
|
5
|
-
* Request body:
|
|
6
|
-
* {
|
|
7
|
-
* "gitUrl": "https://github.com/user/repo.git"
|
|
8
|
-
* }
|
|
9
|
-
*
|
|
10
|
-
* Response: Newline-delimited JSON stream of ProjectEvent objects
|
|
11
|
-
*
|
|
12
|
-
* Requirements:
|
|
13
|
-
* - 6.2 - THE App SHALL send a POST request with the git URL to the CLI
|
|
14
|
-
* - 8.2 - THE CLI SHALL support streaming responses to the client
|
|
15
|
-
*/
|
|
16
|
-
import { Context } from "hono";
|
|
17
|
-
import { ProjectManager } from "../projects/projects.manager.js";
|
|
18
|
-
export declare function handleCreateProject(c: Context, projectManager: ProjectManager): Promise<Response>;
|
|
19
|
-
//# sourceMappingURL=projects-create.route.d.ts.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* POST /api/projects
|
|
3
|
-
* Create a new project from a git URL
|
|
4
|
-
*
|
|
5
|
-
* Request body:
|
|
6
|
-
* {
|
|
7
|
-
* "gitUrl": "https://github.com/user/repo.git"
|
|
8
|
-
* }
|
|
9
|
-
*
|
|
10
|
-
* Response: Newline-delimited JSON stream of ProjectEvent objects
|
|
11
|
-
*
|
|
12
|
-
* Requirements:
|
|
13
|
-
* - 6.2 - THE App SHALL send a POST request with the git URL to the CLI
|
|
14
|
-
* - 8.2 - THE CLI SHALL support streaming responses to the client
|
|
15
|
-
*/
|
|
16
|
-
import { streamAsyncGenerator } from "../../core/stream-helper.js";
|
|
17
|
-
import { CommitMethods, isValidCommitMethod } from "@tarsk/shared";
|
|
18
|
-
import { errorResponse } from "../../core/route-helpers.js";
|
|
19
|
-
import { ErrorCodes } from "../../core/error-responses.js";
|
|
20
|
-
export async function handleCreateProject(c, projectManager) {
|
|
21
|
-
try {
|
|
22
|
-
const body = await c.req.json();
|
|
23
|
-
const { gitUrl, commitMethod } = body;
|
|
24
|
-
// Validate gitUrl is provided
|
|
25
|
-
if (!gitUrl || typeof gitUrl !== "string") {
|
|
26
|
-
return errorResponse(c, ErrorCodes.INVALID_REQUEST, "gitUrl is required and must be a string", 400);
|
|
27
|
-
}
|
|
28
|
-
// Validate commitMethod if provided (default to PullRequest)
|
|
29
|
-
const method = isValidCommitMethod(commitMethod) ? commitMethod : CommitMethods.PullRequest;
|
|
30
|
-
// Stream the project creation events
|
|
31
|
-
return streamAsyncGenerator(c, projectManager.createProject(gitUrl, method));
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
return errorResponse(c, ErrorCodes.REQUEST_PARSE_ERROR, "Failed to parse request body", 400, error instanceof Error ? error.message : String(error));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=projects-create.route.js.map
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DELETE /api/projects/:id
|
|
3
|
-
* Delete a project and all its threads
|
|
4
|
-
*
|
|
5
|
-
* Response:
|
|
6
|
-
* {
|
|
7
|
-
* "success": true,
|
|
8
|
-
* "message": "Project deleted successfully"
|
|
9
|
-
* }
|
|
10
|
-
*
|
|
11
|
-
* Requirements:
|
|
12
|
-
* - 6.2 - THE CLI SHALL expose REST API endpoints for Project operations
|
|
13
|
-
*/
|
|
14
|
-
import { Context } from "hono";
|
|
15
|
-
import { ProjectManager } from "../projects/projects.manager.js";
|
|
16
|
-
export declare function handleDeleteProject(c: Context, projectManager: ProjectManager): Promise<(Response & import("hono").TypedResponse<{
|
|
17
|
-
error: {
|
|
18
|
-
code: string;
|
|
19
|
-
message: string;
|
|
20
|
-
details?: import("hono/utils/types").JSONValue | undefined;
|
|
21
|
-
timestamp: string;
|
|
22
|
-
};
|
|
23
|
-
}, any, "json">) | (Response & import("hono").TypedResponse<import("hono/utils/types").JSONValue, any, "json">)>;
|
|
24
|
-
//# sourceMappingURL=projects-delete.route.d.ts.map
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DELETE /api/projects/:id
|
|
3
|
-
* Delete a project and all its threads
|
|
4
|
-
*
|
|
5
|
-
* Response:
|
|
6
|
-
* {
|
|
7
|
-
* "success": true,
|
|
8
|
-
* "message": "Project deleted successfully"
|
|
9
|
-
* }
|
|
10
|
-
*
|
|
11
|
-
* Requirements:
|
|
12
|
-
* - 6.2 - THE CLI SHALL expose REST API endpoints for Project operations
|
|
13
|
-
*/
|
|
14
|
-
import { errorResponse, successResponse } from "../../core/route-helpers.js";
|
|
15
|
-
import { ErrorCodes } from "../../core/error-responses.js";
|
|
16
|
-
export async function handleDeleteProject(c, projectManager) {
|
|
17
|
-
try {
|
|
18
|
-
const projectId = c.req.param("id");
|
|
19
|
-
if (!projectId) {
|
|
20
|
-
return errorResponse(c, ErrorCodes.INVALID_REQUEST, "Project ID is required", 400);
|
|
21
|
-
}
|
|
22
|
-
await projectManager.deleteProject(projectId);
|
|
23
|
-
return successResponse(c, { success: true, message: "Project deleted successfully" });
|
|
24
|
-
}
|
|
25
|
-
catch (error) {
|
|
26
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
27
|
-
// Check if it's a "not found" error
|
|
28
|
-
if (errorMessage.includes("not found")) {
|
|
29
|
-
return errorResponse(c, ErrorCodes.PROJECT_NOT_FOUND, errorMessage, 404);
|
|
30
|
-
}
|
|
31
|
-
return errorResponse(c, ErrorCodes.DELETE_PROJECT_ERROR, "Failed to delete project", 500, errorMessage);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=projects-delete.route.js.map
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GET /api/projects/:id
|
|
3
|
-
* Get project details by ID
|
|
4
|
-
*
|
|
5
|
-
* Response:
|
|
6
|
-
* {
|
|
7
|
-
* "id": "uuid",
|
|
8
|
-
* "name": "project-name",
|
|
9
|
-
* "gitUrl": "https://github.com/user/repo.git",
|
|
10
|
-
* "path": "/path/to/project",
|
|
11
|
-
* "createdAt": "2024-01-01T00:00:00Z",
|
|
12
|
-
* "threads": ["thread-id-1", "thread-id-2"]
|
|
13
|
-
* }
|
|
14
|
-
*
|
|
15
|
-
* Requirements:
|
|
16
|
-
* - 6.2 - THE CLI SHALL expose REST API endpoints for Project operations
|
|
17
|
-
*/
|
|
18
|
-
import { Context } from "hono";
|
|
19
|
-
import { ProjectManager } from "../projects/projects.manager.js";
|
|
20
|
-
export declare function handleGetProject(c: Context, projectManager: ProjectManager): Promise<(Response & import("hono").TypedResponse<{
|
|
21
|
-
error: {
|
|
22
|
-
code: string;
|
|
23
|
-
message: string;
|
|
24
|
-
details?: import("hono/utils/types").JSONValue | undefined;
|
|
25
|
-
timestamp: string;
|
|
26
|
-
};
|
|
27
|
-
}, any, "json">) | (Response & import("hono").TypedResponse<{
|
|
28
|
-
id: string;
|
|
29
|
-
name: string;
|
|
30
|
-
gitUrl: string;
|
|
31
|
-
path: string;
|
|
32
|
-
createdAt: string;
|
|
33
|
-
threads: string[];
|
|
34
|
-
openWith?: string | undefined;
|
|
35
|
-
commands?: {
|
|
36
|
-
id: string;
|
|
37
|
-
name: string;
|
|
38
|
-
icon: string;
|
|
39
|
-
commandLine: string;
|
|
40
|
-
relativeFolder?: string | undefined;
|
|
41
|
-
}[] | undefined;
|
|
42
|
-
setupScript?: string | undefined;
|
|
43
|
-
pendingSetupScripts?: string[] | undefined;
|
|
44
|
-
runCommand?: string | undefined;
|
|
45
|
-
commitMethod?: import("@tarsk/shared").CommitMethods | undefined;
|
|
46
|
-
}, import("hono/utils/http-status").ContentfulStatusCode, "json">)>;
|
|
47
|
-
//# sourceMappingURL=projects-get.route.d.ts.map
|