@waymakeros/cli 2.0.0
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/README.md +158 -0
- package/dist/cli/cli.d.ts +7 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +703 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +14 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +507 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +297 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/kanban.d.ts +12 -0
- package/dist/cli/commands/kanban.d.ts.map +1 -0
- package/dist/cli/commands/kanban.js +71 -0
- package/dist/cli/commands/kanban.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +12 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +170 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +12 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +222 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/daemon.d.ts +106 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +393 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +238 -0
- package/dist/index.js.map +1 -0
- package/dist/simple-server.d.ts +7 -0
- package/dist/simple-server.d.ts.map +1 -0
- package/dist/simple-server.js +157 -0
- package/dist/simple-server.js.map +1 -0
- package/dist/sync/commander-client.d.ts +161 -0
- package/dist/sync/commander-client.d.ts.map +1 -0
- package/dist/sync/commander-client.js +405 -0
- package/dist/sync/commander-client.js.map +1 -0
- package/dist/sync/config-manager.d.ts +48 -0
- package/dist/sync/config-manager.d.ts.map +1 -0
- package/dist/sync/config-manager.js +169 -0
- package/dist/sync/config-manager.js.map +1 -0
- package/dist/sync/file-watcher.d.ts +53 -0
- package/dist/sync/file-watcher.d.ts.map +1 -0
- package/dist/sync/file-watcher.js +228 -0
- package/dist/sync/file-watcher.js.map +1 -0
- package/dist/sync/folder-service.d.ts +110 -0
- package/dist/sync/folder-service.d.ts.map +1 -0
- package/dist/sync/folder-service.js +298 -0
- package/dist/sync/folder-service.js.map +1 -0
- package/dist/sync/folder-status-mapper.d.ts +106 -0
- package/dist/sync/folder-status-mapper.d.ts.map +1 -0
- package/dist/sync/folder-status-mapper.js +235 -0
- package/dist/sync/folder-status-mapper.js.map +1 -0
- package/dist/sync/layer-resolver.d.ts +54 -0
- package/dist/sync/layer-resolver.d.ts.map +1 -0
- package/dist/sync/layer-resolver.js +206 -0
- package/dist/sync/layer-resolver.js.map +1 -0
- package/dist/sync/markdown-parser.d.ts +49 -0
- package/dist/sync/markdown-parser.d.ts.map +1 -0
- package/dist/sync/markdown-parser.js +202 -0
- package/dist/sync/markdown-parser.js.map +1 -0
- package/dist/sync/reverse-sync.d.ts +139 -0
- package/dist/sync/reverse-sync.d.ts.map +1 -0
- package/dist/sync/reverse-sync.js +773 -0
- package/dist/sync/reverse-sync.js.map +1 -0
- package/dist/sync/sync-engine.d.ts +157 -0
- package/dist/sync/sync-engine.d.ts.map +1 -0
- package/dist/sync/sync-engine.js +875 -0
- package/dist/sync/sync-engine.js.map +1 -0
- package/dist/sync/sync-index.d.ts +150 -0
- package/dist/sync/sync-index.d.ts.map +1 -0
- package/dist/sync/sync-index.js +287 -0
- package/dist/sync/sync-index.js.map +1 -0
- package/dist/sync/trinity-mapper.d.ts +62 -0
- package/dist/sync/trinity-mapper.d.ts.map +1 -0
- package/dist/sync/trinity-mapper.js +548 -0
- package/dist/sync/trinity-mapper.js.map +1 -0
- package/dist/sync/types.d.ts +176 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +6 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/tools/apply-framework.d.ts +7 -0
- package/dist/tools/apply-framework.d.ts.map +1 -0
- package/dist/tools/apply-framework.js +30 -0
- package/dist/tools/apply-framework.js.map +1 -0
- package/dist/tools/commander-comment-create.d.ts +7 -0
- package/dist/tools/commander-comment-create.d.ts.map +1 -0
- package/dist/tools/commander-comment-create.js +100 -0
- package/dist/tools/commander-comment-create.js.map +1 -0
- package/dist/tools/commander-comment-list.d.ts +7 -0
- package/dist/tools/commander-comment-list.d.ts.map +1 -0
- package/dist/tools/commander-comment-list.js +110 -0
- package/dist/tools/commander-comment-list.js.map +1 -0
- package/dist/tools/commander-document-create.d.ts +7 -0
- package/dist/tools/commander-document-create.d.ts.map +1 -0
- package/dist/tools/commander-document-create.js +168 -0
- package/dist/tools/commander-document-create.js.map +1 -0
- package/dist/tools/commander-document-get.d.ts +7 -0
- package/dist/tools/commander-document-get.d.ts.map +1 -0
- package/dist/tools/commander-document-get.js +104 -0
- package/dist/tools/commander-document-get.js.map +1 -0
- package/dist/tools/commander-document-list.d.ts +7 -0
- package/dist/tools/commander-document-list.d.ts.map +1 -0
- package/dist/tools/commander-document-list.js +117 -0
- package/dist/tools/commander-document-list.js.map +1 -0
- package/dist/tools/commander-document-update.d.ts +7 -0
- package/dist/tools/commander-document-update.d.ts.map +1 -0
- package/dist/tools/commander-document-update.js +133 -0
- package/dist/tools/commander-document-update.js.map +1 -0
- package/dist/tools/commander-folder-create.d.ts +7 -0
- package/dist/tools/commander-folder-create.d.ts.map +1 -0
- package/dist/tools/commander-folder-create.js +157 -0
- package/dist/tools/commander-folder-create.js.map +1 -0
- package/dist/tools/commander-folder-delete.d.ts +7 -0
- package/dist/tools/commander-folder-delete.d.ts.map +1 -0
- package/dist/tools/commander-folder-delete.js +85 -0
- package/dist/tools/commander-folder-delete.js.map +1 -0
- package/dist/tools/commander-folder-get.d.ts +7 -0
- package/dist/tools/commander-folder-get.d.ts.map +1 -0
- package/dist/tools/commander-folder-get.js +94 -0
- package/dist/tools/commander-folder-get.js.map +1 -0
- package/dist/tools/commander-folder-list.d.ts +7 -0
- package/dist/tools/commander-folder-list.d.ts.map +1 -0
- package/dist/tools/commander-folder-list.js +96 -0
- package/dist/tools/commander-folder-list.js.map +1 -0
- package/dist/tools/commander-folder-update.d.ts +7 -0
- package/dist/tools/commander-folder-update.d.ts.map +1 -0
- package/dist/tools/commander-folder-update.js +120 -0
- package/dist/tools/commander-folder-update.js.map +1 -0
- package/dist/tools/commander-framework-apply.d.ts +7 -0
- package/dist/tools/commander-framework-apply.d.ts.map +1 -0
- package/dist/tools/commander-framework-apply.js +110 -0
- package/dist/tools/commander-framework-apply.js.map +1 -0
- package/dist/tools/commander-framework-categories.d.ts +7 -0
- package/dist/tools/commander-framework-categories.d.ts.map +1 -0
- package/dist/tools/commander-framework-categories.js +90 -0
- package/dist/tools/commander-framework-categories.js.map +1 -0
- package/dist/tools/commander-framework-get.d.ts +7 -0
- package/dist/tools/commander-framework-get.d.ts.map +1 -0
- package/dist/tools/commander-framework-get.js +124 -0
- package/dist/tools/commander-framework-get.js.map +1 -0
- package/dist/tools/commander-framework-list.d.ts +7 -0
- package/dist/tools/commander-framework-list.d.ts.map +1 -0
- package/dist/tools/commander-framework-list.js +103 -0
- package/dist/tools/commander-framework-list.js.map +1 -0
- package/dist/tools/commander-goal-create.d.ts +7 -0
- package/dist/tools/commander-goal-create.d.ts.map +1 -0
- package/dist/tools/commander-goal-create.js +130 -0
- package/dist/tools/commander-goal-create.js.map +1 -0
- package/dist/tools/commander-goal-get.d.ts +7 -0
- package/dist/tools/commander-goal-get.d.ts.map +1 -0
- package/dist/tools/commander-goal-get.js +83 -0
- package/dist/tools/commander-goal-get.js.map +1 -0
- package/dist/tools/commander-goal-list.d.ts +7 -0
- package/dist/tools/commander-goal-list.d.ts.map +1 -0
- package/dist/tools/commander-goal-list.js +111 -0
- package/dist/tools/commander-goal-list.js.map +1 -0
- package/dist/tools/commander-goal-update.d.ts +7 -0
- package/dist/tools/commander-goal-update.d.ts.map +1 -0
- package/dist/tools/commander-goal-update.js +110 -0
- package/dist/tools/commander-goal-update.js.map +1 -0
- package/dist/tools/commander-key-result-create.d.ts +7 -0
- package/dist/tools/commander-key-result-create.d.ts.map +1 -0
- package/dist/tools/commander-key-result-create.js +134 -0
- package/dist/tools/commander-key-result-create.js.map +1 -0
- package/dist/tools/commander-key-result-update.d.ts +7 -0
- package/dist/tools/commander-key-result-update.d.ts.map +1 -0
- package/dist/tools/commander-key-result-update.js +119 -0
- package/dist/tools/commander-key-result-update.js.map +1 -0
- package/dist/tools/commander-layer-create.d.ts +7 -0
- package/dist/tools/commander-layer-create.d.ts.map +1 -0
- package/dist/tools/commander-layer-create.js +167 -0
- package/dist/tools/commander-layer-create.js.map +1 -0
- package/dist/tools/commander-layer-delete.d.ts +7 -0
- package/dist/tools/commander-layer-delete.d.ts.map +1 -0
- package/dist/tools/commander-layer-delete.js +141 -0
- package/dist/tools/commander-layer-delete.js.map +1 -0
- package/dist/tools/commander-layer-list.d.ts +7 -0
- package/dist/tools/commander-layer-list.d.ts.map +1 -0
- package/dist/tools/commander-layer-list.js +102 -0
- package/dist/tools/commander-layer-list.js.map +1 -0
- package/dist/tools/commander-presentation.d.ts +7 -0
- package/dist/tools/commander-presentation.d.ts.map +1 -0
- package/dist/tools/commander-presentation.js +185 -0
- package/dist/tools/commander-presentation.js.map +1 -0
- package/dist/tools/commander-project-create.d.ts +7 -0
- package/dist/tools/commander-project-create.d.ts.map +1 -0
- package/dist/tools/commander-project-create.js +130 -0
- package/dist/tools/commander-project-create.js.map +1 -0
- package/dist/tools/commander-project-get.d.ts +7 -0
- package/dist/tools/commander-project-get.d.ts.map +1 -0
- package/dist/tools/commander-project-get.js +107 -0
- package/dist/tools/commander-project-get.js.map +1 -0
- package/dist/tools/commander-project-list.d.ts +7 -0
- package/dist/tools/commander-project-list.d.ts.map +1 -0
- package/dist/tools/commander-project-list.js +104 -0
- package/dist/tools/commander-project-list.js.map +1 -0
- package/dist/tools/commander-project-update.d.ts +7 -0
- package/dist/tools/commander-project-update.d.ts.map +1 -0
- package/dist/tools/commander-project-update.js +126 -0
- package/dist/tools/commander-project-update.js.map +1 -0
- package/dist/tools/commander-project.d.ts +7 -0
- package/dist/tools/commander-project.d.ts.map +1 -0
- package/dist/tools/commander-project.js +144 -0
- package/dist/tools/commander-project.js.map +1 -0
- package/dist/tools/commander-role-assign.d.ts +7 -0
- package/dist/tools/commander-role-assign.d.ts.map +1 -0
- package/dist/tools/commander-role-assign.js +115 -0
- package/dist/tools/commander-role-assign.js.map +1 -0
- package/dist/tools/commander-role-create.d.ts +7 -0
- package/dist/tools/commander-role-create.d.ts.map +1 -0
- package/dist/tools/commander-role-create.js +130 -0
- package/dist/tools/commander-role-create.js.map +1 -0
- package/dist/tools/commander-role-get.d.ts +7 -0
- package/dist/tools/commander-role-get.d.ts.map +1 -0
- package/dist/tools/commander-role-get.js +108 -0
- package/dist/tools/commander-role-get.js.map +1 -0
- package/dist/tools/commander-role-list.d.ts +7 -0
- package/dist/tools/commander-role-list.d.ts.map +1 -0
- package/dist/tools/commander-role-list.js +106 -0
- package/dist/tools/commander-role-list.js.map +1 -0
- package/dist/tools/commander-role-update.d.ts +7 -0
- package/dist/tools/commander-role-update.d.ts.map +1 -0
- package/dist/tools/commander-role-update.js +126 -0
- package/dist/tools/commander-role-update.js.map +1 -0
- package/dist/tools/commander-search.d.ts +7 -0
- package/dist/tools/commander-search.d.ts.map +1 -0
- package/dist/tools/commander-search.js +146 -0
- package/dist/tools/commander-search.js.map +1 -0
- package/dist/tools/commander-sheet-create.d.ts +7 -0
- package/dist/tools/commander-sheet-create.d.ts.map +1 -0
- package/dist/tools/commander-sheet-create.js +160 -0
- package/dist/tools/commander-sheet-create.js.map +1 -0
- package/dist/tools/commander-sheet-get.d.ts +7 -0
- package/dist/tools/commander-sheet-get.d.ts.map +1 -0
- package/dist/tools/commander-sheet-get.js +128 -0
- package/dist/tools/commander-sheet-get.js.map +1 -0
- package/dist/tools/commander-sheet-list.d.ts +7 -0
- package/dist/tools/commander-sheet-list.d.ts.map +1 -0
- package/dist/tools/commander-sheet-list.js +108 -0
- package/dist/tools/commander-sheet-list.js.map +1 -0
- package/dist/tools/commander-sheet-update.d.ts +7 -0
- package/dist/tools/commander-sheet-update.d.ts.map +1 -0
- package/dist/tools/commander-sheet-update.js +163 -0
- package/dist/tools/commander-sheet-update.js.map +1 -0
- package/dist/tools/commander-status-list.d.ts +7 -0
- package/dist/tools/commander-status-list.d.ts.map +1 -0
- package/dist/tools/commander-status-list.js +103 -0
- package/dist/tools/commander-status-list.js.map +1 -0
- package/dist/tools/commander-task-assign.d.ts +7 -0
- package/dist/tools/commander-task-assign.d.ts.map +1 -0
- package/dist/tools/commander-task-assign.js +91 -0
- package/dist/tools/commander-task-assign.js.map +1 -0
- package/dist/tools/commander-task-create.d.ts +7 -0
- package/dist/tools/commander-task-create.d.ts.map +1 -0
- package/dist/tools/commander-task-create.js +142 -0
- package/dist/tools/commander-task-create.js.map +1 -0
- package/dist/tools/commander-task-delete.d.ts +7 -0
- package/dist/tools/commander-task-delete.d.ts.map +1 -0
- package/dist/tools/commander-task-delete.js +88 -0
- package/dist/tools/commander-task-delete.js.map +1 -0
- package/dist/tools/commander-task-list-mine.d.ts +7 -0
- package/dist/tools/commander-task-list-mine.d.ts.map +1 -0
- package/dist/tools/commander-task-list-mine.js +109 -0
- package/dist/tools/commander-task-list-mine.js.map +1 -0
- package/dist/tools/commander-task-read.d.ts +10 -0
- package/dist/tools/commander-task-read.d.ts.map +1 -0
- package/dist/tools/commander-task-read.js +96 -0
- package/dist/tools/commander-task-read.js.map +1 -0
- package/dist/tools/commander-task-update.d.ts +7 -0
- package/dist/tools/commander-task-update.d.ts.map +1 -0
- package/dist/tools/commander-task-update.js +159 -0
- package/dist/tools/commander-task-update.js.map +1 -0
- package/dist/tools/commander-taskboard-tasks.d.ts +7 -0
- package/dist/tools/commander-taskboard-tasks.d.ts.map +1 -0
- package/dist/tools/commander-taskboard-tasks.js +97 -0
- package/dist/tools/commander-taskboard-tasks.js.map +1 -0
- package/dist/tools/commander-team-add-member.d.ts +7 -0
- package/dist/tools/commander-team-add-member.d.ts.map +1 -0
- package/dist/tools/commander-team-add-member.js +104 -0
- package/dist/tools/commander-team-add-member.js.map +1 -0
- package/dist/tools/commander-team-create.d.ts +7 -0
- package/dist/tools/commander-team-create.d.ts.map +1 -0
- package/dist/tools/commander-team-create.js +117 -0
- package/dist/tools/commander-team-create.js.map +1 -0
- package/dist/tools/commander-team-list.d.ts +7 -0
- package/dist/tools/commander-team-list.d.ts.map +1 -0
- package/dist/tools/commander-team-list.js +94 -0
- package/dist/tools/commander-team-list.js.map +1 -0
- package/dist/tools/commander-team-remove-member.d.ts +7 -0
- package/dist/tools/commander-team-remove-member.d.ts.map +1 -0
- package/dist/tools/commander-team-remove-member.js +98 -0
- package/dist/tools/commander-team-remove-member.js.map +1 -0
- package/dist/tools/commander-user-get.d.ts +7 -0
- package/dist/tools/commander-user-get.d.ts.map +1 -0
- package/dist/tools/commander-user-get.js +101 -0
- package/dist/tools/commander-user-get.js.map +1 -0
- package/dist/tools/commander-user-invite.d.ts +7 -0
- package/dist/tools/commander-user-invite.d.ts.map +1 -0
- package/dist/tools/commander-user-invite.js +119 -0
- package/dist/tools/commander-user-invite.js.map +1 -0
- package/dist/tools/commander-user-list.d.ts +7 -0
- package/dist/tools/commander-user-list.d.ts.map +1 -0
- package/dist/tools/commander-user-list.js +108 -0
- package/dist/tools/commander-user-list.js.map +1 -0
- package/dist/tools/commander-workspace-create.d.ts +7 -0
- package/dist/tools/commander-workspace-create.d.ts.map +1 -0
- package/dist/tools/commander-workspace-create.js +124 -0
- package/dist/tools/commander-workspace-create.js.map +1 -0
- package/dist/tools/commander-workspace-list.d.ts +7 -0
- package/dist/tools/commander-workspace-list.d.ts.map +1 -0
- package/dist/tools/commander-workspace-list.js +95 -0
- package/dist/tools/commander-workspace-list.js.map +1 -0
- package/dist/tools/commander-workspace-update.d.ts +7 -0
- package/dist/tools/commander-workspace-update.d.ts.map +1 -0
- package/dist/tools/commander-workspace-update.js +118 -0
- package/dist/tools/commander-workspace-update.js.map +1 -0
- package/dist/tools/commander-workspace.d.ts +7 -0
- package/dist/tools/commander-workspace.d.ts.map +1 -0
- package/dist/tools/commander-workspace.js +131 -0
- package/dist/tools/commander-workspace.js.map +1 -0
- package/dist/tools/create-kanban.d.ts +7 -0
- package/dist/tools/create-kanban.d.ts.map +1 -0
- package/dist/tools/create-kanban.js +32 -0
- package/dist/tools/create-kanban.js.map +1 -0
- package/dist/tools/create-table.d.ts +7 -0
- package/dist/tools/create-table.d.ts.map +1 -0
- package/dist/tools/create-table.js +188 -0
- package/dist/tools/create-table.js.map +1 -0
- package/dist/tools/search-knowledge.d.ts +7 -0
- package/dist/tools/search-knowledge.d.ts.map +1 -0
- package/dist/tools/search-knowledge.js +33 -0
- package/dist/tools/search-knowledge.js.map +1 -0
- package/dist/tools/waymaker-kanban-view.d.ts +7 -0
- package/dist/tools/waymaker-kanban-view.d.ts.map +1 -0
- package/dist/tools/waymaker-kanban-view.js +255 -0
- package/dist/tools/waymaker-kanban-view.js.map +1 -0
- package/dist/tools/waymaker-sync-configure.d.ts +13 -0
- package/dist/tools/waymaker-sync-configure.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-configure.js +291 -0
- package/dist/tools/waymaker-sync-configure.js.map +1 -0
- package/dist/tools/waymaker-sync-file.d.ts +7 -0
- package/dist/tools/waymaker-sync-file.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-file.js +79 -0
- package/dist/tools/waymaker-sync-file.js.map +1 -0
- package/dist/tools/waymaker-sync-poll.d.ts +8 -0
- package/dist/tools/waymaker-sync-poll.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-poll.js +398 -0
- package/dist/tools/waymaker-sync-poll.js.map +1 -0
- package/dist/tools/waymaker-sync-start.d.ts +7 -0
- package/dist/tools/waymaker-sync-start.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-start.js +56 -0
- package/dist/tools/waymaker-sync-start.js.map +1 -0
- package/dist/tools/waymaker-sync-status.d.ts +7 -0
- package/dist/tools/waymaker-sync-status.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-status.js +45 -0
- package/dist/tools/waymaker-sync-status.js.map +1 -0
- package/dist/tools/waymaker-sync-stop.d.ts +7 -0
- package/dist/tools/waymaker-sync-stop.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-stop.js +56 -0
- package/dist/tools/waymaker-sync-stop.js.map +1 -0
- package/dist/tools/waymaker-sync-workspace.d.ts +26 -0
- package/dist/tools/waymaker-sync-workspace.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-workspace.js +148 -0
- package/dist/tools/waymaker-sync-workspace.js.map +1 -0
- package/dist/tools/waymaker-sync-workspace.tool.d.ts +9 -0
- package/dist/tools/waymaker-sync-workspace.tool.d.ts.map +1 -0
- package/dist/tools/waymaker-sync-workspace.tool.js +68 -0
- package/dist/tools/waymaker-sync-workspace.tool.js.map +1 -0
- package/dist/types/tool.d.ts +13 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +2 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/daemon-health.d.ts +21 -0
- package/dist/utils/daemon-health.d.ts.map +1 -0
- package/dist/utils/daemon-health.js +40 -0
- package/dist/utils/daemon-health.js.map +1 -0
- package/dist/utils/fetch-ipv4.d.ts +36 -0
- package/dist/utils/fetch-ipv4.d.ts.map +1 -0
- package/dist/utils/fetch-ipv4.js +91 -0
- package/dist/utils/fetch-ipv4.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waymaker Sync - Folder Service
|
|
3
|
+
* Auto-creates folder hierarchy to mirror IDE structure in Commander
|
|
4
|
+
*/
|
|
5
|
+
import { CommanderClient } from './commander-client.js';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* FolderService - Manages folder hierarchy syncing from IDE to Commander
|
|
9
|
+
*
|
|
10
|
+
* Responsibilities:
|
|
11
|
+
* 1. Parse file paths into folder hierarchy
|
|
12
|
+
* 2. Create missing folders in Commander
|
|
13
|
+
* 3. Cache folder lookups to avoid duplicates
|
|
14
|
+
* 4. Return folder_id for document assignment
|
|
15
|
+
*
|
|
16
|
+
* Example:
|
|
17
|
+
* File path: /Users/name/Projects/waymaker/docs/01-planning/features/api-keys.md
|
|
18
|
+
* Project root: /Users/name/Projects/waymaker
|
|
19
|
+
* Relative path: docs/01-planning/features/api-keys.md
|
|
20
|
+
* Folder hierarchy: docs → 01-planning → features
|
|
21
|
+
*/
|
|
22
|
+
export class FolderService {
|
|
23
|
+
client;
|
|
24
|
+
config;
|
|
25
|
+
folderCache; // Cache: "folder/path" → folder object
|
|
26
|
+
initialized = false;
|
|
27
|
+
initializationPromise = null; // Lock for concurrent initialization
|
|
28
|
+
constructor(config, client) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.client = client || new CommanderClient();
|
|
31
|
+
this.folderCache = new Map();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize folder cache by loading all existing folders from Commander
|
|
35
|
+
* Call this once before starting sync operations
|
|
36
|
+
* Uses promise lock to prevent concurrent initialization
|
|
37
|
+
*/
|
|
38
|
+
async initialize() {
|
|
39
|
+
// If already initialized, return immediately
|
|
40
|
+
if (this.initialized) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// If initialization is in progress, wait for it
|
|
44
|
+
if (this.initializationPromise) {
|
|
45
|
+
console.log('[FolderService] Waiting for ongoing initialization...');
|
|
46
|
+
await this.initializationPromise;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Start initialization
|
|
50
|
+
console.log('[FolderService] Initializing folder cache...');
|
|
51
|
+
this.initializationPromise = (async () => {
|
|
52
|
+
try {
|
|
53
|
+
const folders = await this.listAllFolders();
|
|
54
|
+
console.log(`[FolderService] Loaded ${folders.length} existing folders`);
|
|
55
|
+
// Build folder path map
|
|
56
|
+
const folderMap = new Map();
|
|
57
|
+
folders.forEach(folder => folderMap.set(folder.id, folder));
|
|
58
|
+
// Build cache with full paths
|
|
59
|
+
for (const folder of folders) {
|
|
60
|
+
const fullPath = this.buildFolderPath(folder, folderMap);
|
|
61
|
+
this.folderCache.set(fullPath, folder);
|
|
62
|
+
}
|
|
63
|
+
this.initialized = true;
|
|
64
|
+
console.log('[FolderService] ✅ Initialization complete');
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error('[FolderService] ❌ Initialization failed:', error);
|
|
68
|
+
this.initializationPromise = null; // Reset on error to allow retry
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
})();
|
|
72
|
+
await this.initializationPromise;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Ensure folder hierarchy exists for a file path
|
|
76
|
+
* Returns folder_id for the deepest folder (to assign to document)
|
|
77
|
+
*
|
|
78
|
+
* Example:
|
|
79
|
+
* Input: /Users/name/Projects/waymaker/docs/01-planning/features/api-keys.md
|
|
80
|
+
* Output: folder_id for "features" folder
|
|
81
|
+
* Side effect: Creates "docs", "01-planning", "features" if they don't exist
|
|
82
|
+
*/
|
|
83
|
+
async ensureFolderHierarchy(absoluteFilePath) {
|
|
84
|
+
if (!this.initialized) {
|
|
85
|
+
await this.initialize();
|
|
86
|
+
}
|
|
87
|
+
// Extract relative path from project root
|
|
88
|
+
const relativePath = this.getRelativePath(absoluteFilePath);
|
|
89
|
+
if (!relativePath) {
|
|
90
|
+
console.log('[FolderService] File is at project root, no folder needed');
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
// Parse folder path (remove filename)
|
|
94
|
+
const folderPath = path.dirname(relativePath);
|
|
95
|
+
if (folderPath === '.' || folderPath === '') {
|
|
96
|
+
console.log('[FolderService] File is at project root, no folder needed');
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
console.log(`[FolderService] Ensuring folder hierarchy for: ${folderPath}`);
|
|
100
|
+
// Split into folder parts: "docs/01-planning/features" → ["docs", "01-planning", "features"]
|
|
101
|
+
const folderParts = folderPath.split(path.sep).filter(p => p && p !== '.');
|
|
102
|
+
// Create folders recursively
|
|
103
|
+
let parentFolderId = null;
|
|
104
|
+
let currentPath = '';
|
|
105
|
+
for (let i = 0; i < folderParts.length; i++) {
|
|
106
|
+
const folderName = folderParts[i];
|
|
107
|
+
currentPath = i === 0 ? folderName : `${currentPath}/${folderName}`;
|
|
108
|
+
// Check cache first
|
|
109
|
+
let cached = this.folderCache.get(currentPath);
|
|
110
|
+
if (cached) {
|
|
111
|
+
console.log(`[FolderService] ✅ Folder exists (cached): ${currentPath} → ${cached.id}`);
|
|
112
|
+
parentFolderId = cached.id;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// Create folder (with race condition handling)
|
|
116
|
+
console.log(`[FolderService] 🆕 Creating folder: ${folderName} (parent: ${parentFolderId || 'root'})`);
|
|
117
|
+
const folder = await this.createFolderWithRetry({
|
|
118
|
+
name: folderName,
|
|
119
|
+
parent_folder_id: parentFolderId,
|
|
120
|
+
folderPath: currentPath,
|
|
121
|
+
});
|
|
122
|
+
// Cache the created/fetched folder
|
|
123
|
+
this.folderCache.set(currentPath, folder);
|
|
124
|
+
console.log(`[FolderService] ✅ Folder ready: ${currentPath} → ${folder.id}`);
|
|
125
|
+
parentFolderId = folder.id;
|
|
126
|
+
}
|
|
127
|
+
return parentFolderId;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a single folder in Commander with retry logic for race conditions
|
|
131
|
+
* If folder creation fails due to unique constraint, fetch the existing folder
|
|
132
|
+
*/
|
|
133
|
+
async createFolderWithRetry(params) {
|
|
134
|
+
try {
|
|
135
|
+
// Attempt to create folder
|
|
136
|
+
const response = await this.client.callEdgeFunction('commander-folder-operations', {
|
|
137
|
+
operation: 'create',
|
|
138
|
+
data: {
|
|
139
|
+
name: params.name,
|
|
140
|
+
project_id: this.config.projectId,
|
|
141
|
+
workspace_id: this.config.workspaceId,
|
|
142
|
+
organization_id: this.config.organizationId,
|
|
143
|
+
parent_folder_id: params.parent_folder_id,
|
|
144
|
+
sort_order: 0,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
return response.data;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
// Check if error is due to unique constraint violation (folder already exists)
|
|
151
|
+
const isDuplicateError = error?.message?.includes('duplicate key value') ||
|
|
152
|
+
error?.message?.includes('unique constraint') ||
|
|
153
|
+
error?.message?.includes('unique_folder_name');
|
|
154
|
+
if (isDuplicateError) {
|
|
155
|
+
console.log(`[FolderService] ⚠️ Folder already exists (race condition), fetching...`);
|
|
156
|
+
// Double-check cache (another concurrent call may have added it)
|
|
157
|
+
const cached = this.folderCache.get(params.folderPath);
|
|
158
|
+
if (cached) {
|
|
159
|
+
console.log(`[FolderService] ✅ Found in cache after race: ${params.folderPath}`);
|
|
160
|
+
return cached;
|
|
161
|
+
}
|
|
162
|
+
// Fetch the existing folder from database
|
|
163
|
+
const folders = await this.listAllFolders();
|
|
164
|
+
const existingFolder = folders.find(f => f.name === params.name && f.parent_folder_id === params.parent_folder_id);
|
|
165
|
+
if (existingFolder) {
|
|
166
|
+
console.log(`[FolderService] ✅ Fetched existing folder: ${params.name} → ${existingFolder.id}`);
|
|
167
|
+
return existingFolder;
|
|
168
|
+
}
|
|
169
|
+
// If we still can't find it, re-throw the original error
|
|
170
|
+
console.error(`[FolderService] ❌ Could not find folder after duplicate error`);
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
// Re-throw non-duplicate errors
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* List all folders for the project
|
|
179
|
+
*/
|
|
180
|
+
async listAllFolders() {
|
|
181
|
+
const response = await this.client.callEdgeFunction('commander-folder-operations', {
|
|
182
|
+
operation: 'list',
|
|
183
|
+
data: {
|
|
184
|
+
project_id: this.config.projectId,
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
return response.data || [];
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Build full folder path from folder ID by traversing parent hierarchy
|
|
191
|
+
*/
|
|
192
|
+
buildFolderPath(folder, folderMap) {
|
|
193
|
+
const parts = [];
|
|
194
|
+
let current = folder;
|
|
195
|
+
while (current) {
|
|
196
|
+
parts.unshift(current.name);
|
|
197
|
+
if (current.parent_folder_id) {
|
|
198
|
+
current = folderMap.get(current.parent_folder_id);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return parts.join('/');
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get relative path from project root
|
|
208
|
+
* Example:
|
|
209
|
+
* Absolute: /Users/name/Projects/waymaker/docs/file.md
|
|
210
|
+
* Root: /Users/name/Projects/waymaker
|
|
211
|
+
* Relative: docs/file.md
|
|
212
|
+
*/
|
|
213
|
+
getRelativePath(absolutePath) {
|
|
214
|
+
// Normalize both paths
|
|
215
|
+
const normalizedRoot = path.resolve(this.config.projectRoot);
|
|
216
|
+
const normalizedFile = path.resolve(absolutePath);
|
|
217
|
+
// Check if file is within project root
|
|
218
|
+
if (!normalizedFile.startsWith(normalizedRoot)) {
|
|
219
|
+
throw new Error(`File ${absolutePath} is not within project root ${this.config.projectRoot}`);
|
|
220
|
+
}
|
|
221
|
+
// Get relative path
|
|
222
|
+
const relativePath = path.relative(normalizedRoot, normalizedFile);
|
|
223
|
+
return relativePath;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Ensure a folder path exists (for empty folder sync)
|
|
227
|
+
* Unlike ensureFolderHierarchy which takes a file path, this takes a folder path directly
|
|
228
|
+
*
|
|
229
|
+
* Example:
|
|
230
|
+
* Input: "docs/05-reference/api" (relative to project root)
|
|
231
|
+
* Output: folder_id for "api" folder
|
|
232
|
+
* Side effect: Creates "docs", "05-reference", "api" if they don't exist
|
|
233
|
+
*/
|
|
234
|
+
async ensureFolderPath(relativeFolderPath) {
|
|
235
|
+
if (!this.initialized) {
|
|
236
|
+
await this.initialize();
|
|
237
|
+
}
|
|
238
|
+
// Normalize path
|
|
239
|
+
const folderPath = relativeFolderPath.replace(/\\/g, '/').replace(/\/$/, '');
|
|
240
|
+
if (!folderPath || folderPath === '.' || folderPath === '') {
|
|
241
|
+
console.log('[FolderService] Empty path, no folder needed');
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
console.log(`[FolderService] Ensuring folder path: ${folderPath}`);
|
|
245
|
+
// Split into folder parts: "docs/01-planning/features" → ["docs", "01-planning", "features"]
|
|
246
|
+
const folderParts = folderPath.split('/').filter(p => p && p !== '.');
|
|
247
|
+
// Create folders recursively
|
|
248
|
+
let parentFolderId = null;
|
|
249
|
+
let currentPath = '';
|
|
250
|
+
for (let i = 0; i < folderParts.length; i++) {
|
|
251
|
+
const folderName = folderParts[i];
|
|
252
|
+
currentPath = i === 0 ? folderName : `${currentPath}/${folderName}`;
|
|
253
|
+
// Check cache first
|
|
254
|
+
let cached = this.folderCache.get(currentPath);
|
|
255
|
+
if (cached) {
|
|
256
|
+
parentFolderId = cached.id;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
// Create folder (with race condition handling)
|
|
260
|
+
console.log(`[FolderService] 🆕 Creating folder: ${folderName} (parent: ${parentFolderId || 'root'})`);
|
|
261
|
+
const folder = await this.createFolderWithRetry({
|
|
262
|
+
name: folderName,
|
|
263
|
+
parent_folder_id: parentFolderId,
|
|
264
|
+
folderPath: currentPath,
|
|
265
|
+
});
|
|
266
|
+
// Cache the created/fetched folder
|
|
267
|
+
this.folderCache.set(currentPath, folder);
|
|
268
|
+
console.log(`[FolderService] ✅ Folder ready: ${currentPath} → ${folder.id}`);
|
|
269
|
+
parentFolderId = folder.id;
|
|
270
|
+
}
|
|
271
|
+
return parentFolderId;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Clear cache (useful for testing or when folders are modified externally)
|
|
275
|
+
*/
|
|
276
|
+
clearCache() {
|
|
277
|
+
this.folderCache.clear();
|
|
278
|
+
this.initialized = false;
|
|
279
|
+
this.initializationPromise = null;
|
|
280
|
+
console.log('[FolderService] Cache cleared');
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get folder by path (for testing/debugging)
|
|
284
|
+
*/
|
|
285
|
+
getFolderByPath(folderPath) {
|
|
286
|
+
return this.folderCache.get(folderPath);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get cache statistics (for debugging)
|
|
290
|
+
*/
|
|
291
|
+
getCacheStats() {
|
|
292
|
+
return {
|
|
293
|
+
size: this.folderCache.size,
|
|
294
|
+
paths: Array.from(this.folderCache.keys()),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=folder-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-service.js","sourceRoot":"","sources":["../../src/sync/folder-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waymaker Sync - Folder Status Mapper
|
|
3
|
+
* Maps folder locations to Commander status sections
|
|
4
|
+
*
|
|
5
|
+
* The "folder = status" paradigm: file location determines task status
|
|
6
|
+
* Moving a file between folders = changing task status
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Default folder-to-status mappings
|
|
10
|
+
* These map common folder names to Commander status sections
|
|
11
|
+
*/
|
|
12
|
+
export declare const DEFAULT_FOLDER_MAPPINGS: FolderMapping[];
|
|
13
|
+
/**
|
|
14
|
+
* Folder mapping configuration
|
|
15
|
+
*/
|
|
16
|
+
export interface FolderMapping {
|
|
17
|
+
folderName: string;
|
|
18
|
+
statusSection: string;
|
|
19
|
+
isCompleted?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Result of status extraction from path
|
|
23
|
+
*/
|
|
24
|
+
export interface StatusFromPath {
|
|
25
|
+
statusSection: string;
|
|
26
|
+
isCompleted: boolean;
|
|
27
|
+
folderName: string;
|
|
28
|
+
confidence: 'exact' | 'inferred' | 'default';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result of path generation from status
|
|
32
|
+
*/
|
|
33
|
+
export interface PathFromStatus {
|
|
34
|
+
folderName: string;
|
|
35
|
+
suggestedPath: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Folder Status Mapper
|
|
39
|
+
* Handles bidirectional mapping between folder locations and status sections
|
|
40
|
+
*/
|
|
41
|
+
export declare class FolderStatusMapper {
|
|
42
|
+
private mappings;
|
|
43
|
+
constructor(customMappings?: FolderMapping[]);
|
|
44
|
+
/**
|
|
45
|
+
* Extract status from file path
|
|
46
|
+
*
|
|
47
|
+
* Examples:
|
|
48
|
+
* /docs/02-working/tasks/in-progress/feature.md → "In Progress"
|
|
49
|
+
* /docs/02-working/tasks/done/feature.md → "Done"
|
|
50
|
+
* /docs/01-planning/epics/active/payments.md → "In Progress"
|
|
51
|
+
*/
|
|
52
|
+
getStatusFromPath(filePath: string): StatusFromPath;
|
|
53
|
+
/**
|
|
54
|
+
* Infer status from path patterns when no exact match
|
|
55
|
+
*/
|
|
56
|
+
private inferStatusFromPath;
|
|
57
|
+
/**
|
|
58
|
+
* Get folder name for a given status section
|
|
59
|
+
* Used when creating files from Commander tasks
|
|
60
|
+
*/
|
|
61
|
+
getFolderForStatus(statusSection: string): PathFromStatus;
|
|
62
|
+
/**
|
|
63
|
+
* Calculate new file path when status changes
|
|
64
|
+
*
|
|
65
|
+
* @param currentPath Current file path
|
|
66
|
+
* @param newStatus New status section name
|
|
67
|
+
* @param basePath Base path for tasks (e.g., /docs/02-working/tasks)
|
|
68
|
+
*/
|
|
69
|
+
getNewPathForStatus(currentPath: string, newStatus: string, basePath?: string): string;
|
|
70
|
+
/**
|
|
71
|
+
* Check if a path contains a status folder
|
|
72
|
+
*/
|
|
73
|
+
hasStatusFolder(filePath: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Get all registered folder mappings
|
|
76
|
+
*/
|
|
77
|
+
getAllMappings(): FolderMapping[];
|
|
78
|
+
/**
|
|
79
|
+
* Add or update a custom mapping
|
|
80
|
+
*/
|
|
81
|
+
addMapping(mapping: FolderMapping): void;
|
|
82
|
+
/**
|
|
83
|
+
* Remove a mapping
|
|
84
|
+
*/
|
|
85
|
+
removeMapping(folderName: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Get status sections grouped by completion state
|
|
88
|
+
*/
|
|
89
|
+
getStatusSectionsByCompletion(): {
|
|
90
|
+
open: string[];
|
|
91
|
+
completed: string[];
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Detect file move between status folders
|
|
95
|
+
* Returns the status change if detected
|
|
96
|
+
*/
|
|
97
|
+
detectStatusChange(oldPath: string, newPath: string): {
|
|
98
|
+
oldStatus: StatusFromPath;
|
|
99
|
+
newStatus: StatusFromPath;
|
|
100
|
+
} | null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Singleton instance with default mappings
|
|
104
|
+
*/
|
|
105
|
+
export declare const folderStatusMapper: FolderStatusMapper;
|
|
106
|
+
//# sourceMappingURL=folder-status-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-status-mapper.d.ts","sourceRoot":"","sources":["../../src/sync/folder-status-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,EAelD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,cAAc,GAAE,aAAa,EAAO;IAchD;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAmCnD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;;OAGG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc;IAyBzD;;;;;;OAMG;IACH,mBAAmB,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM;IA8BT;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK1C;;OAEG;IACH,cAAc,IAAI,aAAa,EAAE;IAIjC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIxC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACH,6BAA6B,IAAI;QAC/B,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB;IAkBD;;;OAGG;IACH,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;QAAE,SAAS,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,cAAc,CAAA;KAAE,GAAG,IAAI;CAWnE;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waymaker Sync - Folder Status Mapper
|
|
3
|
+
* Maps folder locations to Commander status sections
|
|
4
|
+
*
|
|
5
|
+
* The "folder = status" paradigm: file location determines task status
|
|
6
|
+
* Moving a file between folders = changing task status
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Default folder-to-status mappings
|
|
11
|
+
* These map common folder names to Commander status sections
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_FOLDER_MAPPINGS = [
|
|
14
|
+
{ folderName: 'backlog', statusSection: 'Backlog', isCompleted: false },
|
|
15
|
+
{ folderName: 'to-do', statusSection: 'To Do', isCompleted: false },
|
|
16
|
+
{ folderName: 'todo', statusSection: 'To Do', isCompleted: false },
|
|
17
|
+
{ folderName: 'in-progress', statusSection: 'In Progress', isCompleted: false },
|
|
18
|
+
{ folderName: 'in_progress', statusSection: 'In Progress', isCompleted: false },
|
|
19
|
+
{ folderName: 'review', statusSection: 'Review', isCompleted: false },
|
|
20
|
+
{ folderName: 'blocked', statusSection: 'Blocked', isCompleted: false },
|
|
21
|
+
{ folderName: 'done', statusSection: 'Done', isCompleted: true },
|
|
22
|
+
{ folderName: 'completed', statusSection: 'Done', isCompleted: true },
|
|
23
|
+
{ folderName: 'archived', statusSection: 'Archived', isCompleted: true },
|
|
24
|
+
// Epic/PRD status folders
|
|
25
|
+
{ folderName: 'active', statusSection: 'In Progress', isCompleted: false },
|
|
26
|
+
{ folderName: 'planned', statusSection: 'Backlog', isCompleted: false },
|
|
27
|
+
{ folderName: 'cancelled', statusSection: 'Cancelled', isCompleted: true },
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Folder Status Mapper
|
|
31
|
+
* Handles bidirectional mapping between folder locations and status sections
|
|
32
|
+
*/
|
|
33
|
+
export class FolderStatusMapper {
|
|
34
|
+
mappings;
|
|
35
|
+
constructor(customMappings = []) {
|
|
36
|
+
this.mappings = new Map();
|
|
37
|
+
// Load default mappings first
|
|
38
|
+
for (const mapping of DEFAULT_FOLDER_MAPPINGS) {
|
|
39
|
+
this.mappings.set(mapping.folderName.toLowerCase(), mapping);
|
|
40
|
+
}
|
|
41
|
+
// Override with custom mappings
|
|
42
|
+
for (const mapping of customMappings) {
|
|
43
|
+
this.mappings.set(mapping.folderName.toLowerCase(), mapping);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Extract status from file path
|
|
48
|
+
*
|
|
49
|
+
* Examples:
|
|
50
|
+
* /docs/02-working/tasks/in-progress/feature.md → "In Progress"
|
|
51
|
+
* /docs/02-working/tasks/done/feature.md → "Done"
|
|
52
|
+
* /docs/01-planning/epics/active/payments.md → "In Progress"
|
|
53
|
+
*/
|
|
54
|
+
getStatusFromPath(filePath) {
|
|
55
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
56
|
+
const parts = normalizedPath.split('/');
|
|
57
|
+
// Check each folder in the path, from deepest to root
|
|
58
|
+
// The deepest matching folder wins
|
|
59
|
+
for (let i = parts.length - 2; i >= 0; i--) {
|
|
60
|
+
const folderName = parts[i].toLowerCase();
|
|
61
|
+
const mapping = this.mappings.get(folderName);
|
|
62
|
+
if (mapping) {
|
|
63
|
+
return {
|
|
64
|
+
statusSection: mapping.statusSection,
|
|
65
|
+
isCompleted: mapping.isCompleted ?? false,
|
|
66
|
+
folderName: mapping.folderName,
|
|
67
|
+
confidence: 'exact',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Try to infer from path patterns
|
|
72
|
+
const inferred = this.inferStatusFromPath(normalizedPath);
|
|
73
|
+
if (inferred) {
|
|
74
|
+
return inferred;
|
|
75
|
+
}
|
|
76
|
+
// Default to "Backlog" if no status can be determined
|
|
77
|
+
return {
|
|
78
|
+
statusSection: 'Backlog',
|
|
79
|
+
isCompleted: false,
|
|
80
|
+
folderName: 'backlog',
|
|
81
|
+
confidence: 'default',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Infer status from path patterns when no exact match
|
|
86
|
+
*/
|
|
87
|
+
inferStatusFromPath(normalizedPath) {
|
|
88
|
+
// Check for common patterns in path
|
|
89
|
+
const pathLower = normalizedPath.toLowerCase();
|
|
90
|
+
// Session briefs are typically completed
|
|
91
|
+
if (pathLower.includes('/sessions/completed/') ||
|
|
92
|
+
pathLower.includes('/sessions/done/')) {
|
|
93
|
+
return {
|
|
94
|
+
statusSection: 'Done',
|
|
95
|
+
isCompleted: true,
|
|
96
|
+
folderName: 'completed',
|
|
97
|
+
confidence: 'inferred',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Current sessions are in progress
|
|
101
|
+
if (pathLower.includes('/sessions/current/') ||
|
|
102
|
+
pathLower.includes('/sessions/active/')) {
|
|
103
|
+
return {
|
|
104
|
+
statusSection: 'In Progress',
|
|
105
|
+
isCompleted: false,
|
|
106
|
+
folderName: 'current',
|
|
107
|
+
confidence: 'inferred',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// PRDs in planning are typically backlog unless marked active
|
|
111
|
+
if (pathLower.includes('/01-planning/') &&
|
|
112
|
+
!pathLower.includes('/active/')) {
|
|
113
|
+
return {
|
|
114
|
+
statusSection: 'Backlog',
|
|
115
|
+
isCompleted: false,
|
|
116
|
+
folderName: 'planning',
|
|
117
|
+
confidence: 'inferred',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get folder name for a given status section
|
|
124
|
+
* Used when creating files from Commander tasks
|
|
125
|
+
*/
|
|
126
|
+
getFolderForStatus(statusSection) {
|
|
127
|
+
const statusLower = statusSection.toLowerCase();
|
|
128
|
+
// Find matching mapping
|
|
129
|
+
for (const [folderName, mapping] of this.mappings) {
|
|
130
|
+
if (mapping.statusSection.toLowerCase() === statusLower) {
|
|
131
|
+
return {
|
|
132
|
+
folderName,
|
|
133
|
+
suggestedPath: folderName,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Convert status to folder-friendly name
|
|
138
|
+
const folderName = statusSection
|
|
139
|
+
.toLowerCase()
|
|
140
|
+
.replace(/\s+/g, '-')
|
|
141
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
142
|
+
return {
|
|
143
|
+
folderName,
|
|
144
|
+
suggestedPath: folderName,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Calculate new file path when status changes
|
|
149
|
+
*
|
|
150
|
+
* @param currentPath Current file path
|
|
151
|
+
* @param newStatus New status section name
|
|
152
|
+
* @param basePath Base path for tasks (e.g., /docs/02-working/tasks)
|
|
153
|
+
*/
|
|
154
|
+
getNewPathForStatus(currentPath, newStatus, basePath) {
|
|
155
|
+
const normalizedPath = currentPath.replace(/\\/g, '/');
|
|
156
|
+
const currentStatus = this.getStatusFromPath(currentPath);
|
|
157
|
+
const newFolder = this.getFolderForStatus(newStatus);
|
|
158
|
+
// If the current path contains a known status folder, replace it
|
|
159
|
+
if (currentStatus.confidence === 'exact') {
|
|
160
|
+
const oldFolderPattern = new RegExp(`/${currentStatus.folderName}/`, 'i');
|
|
161
|
+
if (oldFolderPattern.test(normalizedPath)) {
|
|
162
|
+
return normalizedPath.replace(oldFolderPattern, `/${newFolder.folderName}/`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// If we have a base path, construct the new path
|
|
166
|
+
if (basePath) {
|
|
167
|
+
const fileName = path.basename(currentPath);
|
|
168
|
+
return path.join(basePath, newFolder.folderName, fileName);
|
|
169
|
+
}
|
|
170
|
+
// Fallback: just return the current path (can't determine new location)
|
|
171
|
+
return currentPath;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Check if a path contains a status folder
|
|
175
|
+
*/
|
|
176
|
+
hasStatusFolder(filePath) {
|
|
177
|
+
const status = this.getStatusFromPath(filePath);
|
|
178
|
+
return status.confidence !== 'default';
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get all registered folder mappings
|
|
182
|
+
*/
|
|
183
|
+
getAllMappings() {
|
|
184
|
+
return Array.from(this.mappings.values());
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Add or update a custom mapping
|
|
188
|
+
*/
|
|
189
|
+
addMapping(mapping) {
|
|
190
|
+
this.mappings.set(mapping.folderName.toLowerCase(), mapping);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Remove a mapping
|
|
194
|
+
*/
|
|
195
|
+
removeMapping(folderName) {
|
|
196
|
+
return this.mappings.delete(folderName.toLowerCase());
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get status sections grouped by completion state
|
|
200
|
+
*/
|
|
201
|
+
getStatusSectionsByCompletion() {
|
|
202
|
+
const open = new Set();
|
|
203
|
+
const completed = new Set();
|
|
204
|
+
for (const mapping of this.mappings.values()) {
|
|
205
|
+
if (mapping.isCompleted) {
|
|
206
|
+
completed.add(mapping.statusSection);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
open.add(mapping.statusSection);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
open: Array.from(open),
|
|
214
|
+
completed: Array.from(completed),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Detect file move between status folders
|
|
219
|
+
* Returns the status change if detected
|
|
220
|
+
*/
|
|
221
|
+
detectStatusChange(oldPath, newPath) {
|
|
222
|
+
const oldStatus = this.getStatusFromPath(oldPath);
|
|
223
|
+
const newStatus = this.getStatusFromPath(newPath);
|
|
224
|
+
// Only report if status actually changed
|
|
225
|
+
if (oldStatus.statusSection !== newStatus.statusSection) {
|
|
226
|
+
return { oldStatus, newStatus };
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Singleton instance with default mappings
|
|
233
|
+
*/
|
|
234
|
+
export const folderStatusMapper = new FolderStatusMapper();
|
|
235
|
+
//# sourceMappingURL=folder-status-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-status-mapper.js","sourceRoot":"","sources":["../../src/sync/folder-status-mapper.ts"],"names":[],"mappings":"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"}
|