@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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer Path Resolver
|
|
3
|
+
* Resolves hierarchical layer paths like "Product/Sprint 1" to layer IDs,
|
|
4
|
+
* auto-creating missing parent layers as needed.
|
|
5
|
+
*/
|
|
6
|
+
export interface LayerInfo {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
parent_layer_id: string | null;
|
|
10
|
+
board_id: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ResolveResult {
|
|
13
|
+
layerId: string;
|
|
14
|
+
layerPath: string;
|
|
15
|
+
created: boolean;
|
|
16
|
+
createdLayers: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse a layer path into segments
|
|
20
|
+
* "Product/Sprint 1" -> ["Product", "Sprint 1"]
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseLayerPath(layerPath: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a layer path to an ID, creating missing parent layers as needed
|
|
25
|
+
*
|
|
26
|
+
* @param taskboardId - The taskboard to resolve layers on
|
|
27
|
+
* @param layerPath - Path like "Product/Sprint 1" or "Product"
|
|
28
|
+
* @param autoCreate - Whether to create missing layers (default: true)
|
|
29
|
+
* @returns ResolveResult with layerId, path, and creation info
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Resolve "Product/Sprint 1" - creates "Product" if missing, then "Sprint 1"
|
|
33
|
+
* const result = await resolveOrCreateLayerPath(taskboardId, "Product/Sprint 1");
|
|
34
|
+
* console.log(result.layerId); // UUID of "Sprint 1" layer
|
|
35
|
+
* console.log(result.created); // true if any layers were created
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveOrCreateLayerPath(taskboardId: string, layerPath: string, autoCreate?: boolean): Promise<ResolveResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a layer path without creating missing layers
|
|
40
|
+
* Throws if any segment is not found
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveLayerPath(taskboardId: string, layerPath: string): Promise<ResolveResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Get the full path for a layer ID by traversing up the parent chain
|
|
45
|
+
*/
|
|
46
|
+
export declare function getLayerPath(taskboardId: string, layerId: string): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Validate a layer path format
|
|
49
|
+
*/
|
|
50
|
+
export declare function validateLayerPath(layerPath: string): {
|
|
51
|
+
valid: boolean;
|
|
52
|
+
error?: string;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=layer-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-resolver.d.ts","sourceRoot":"","sources":["../../src/sync/layer-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAK1D;AAiGD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,OAAc,GACzB,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAExB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBvF"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer Path Resolver
|
|
3
|
+
* Resolves hierarchical layer paths like "Product/Sprint 1" to layer IDs,
|
|
4
|
+
* auto-creating missing parent layers as needed.
|
|
5
|
+
*/
|
|
6
|
+
// Environment configuration
|
|
7
|
+
const WAYMAKER_APPS_URL = process.env.WAYMAKER_APPS_URL || 'https://apps.waymakerone.com';
|
|
8
|
+
const WAYMAKER_API_KEY = process.env.WAYMAKER_API_KEY;
|
|
9
|
+
/**
|
|
10
|
+
* Parse a layer path into segments
|
|
11
|
+
* "Product/Sprint 1" -> ["Product", "Sprint 1"]
|
|
12
|
+
*/
|
|
13
|
+
export function parseLayerPath(layerPath) {
|
|
14
|
+
return layerPath
|
|
15
|
+
.split('/')
|
|
16
|
+
.map(s => s.trim())
|
|
17
|
+
.filter(Boolean);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Find a layer by name and optional parent
|
|
21
|
+
*/
|
|
22
|
+
async function findLayer(taskboardId, name, parentLayerId) {
|
|
23
|
+
if (!WAYMAKER_API_KEY) {
|
|
24
|
+
throw new Error('WAYMAKER_API_KEY environment variable not set');
|
|
25
|
+
}
|
|
26
|
+
const response = await fetch(`${WAYMAKER_APPS_URL}/functions/v1/commander-layer-operations`, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: {
|
|
29
|
+
'Authorization': `Bearer ${WAYMAKER_API_KEY}`,
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
},
|
|
32
|
+
body: JSON.stringify({
|
|
33
|
+
action: 'list-layers',
|
|
34
|
+
taskboardId,
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const errorText = await response.text();
|
|
39
|
+
throw new Error(`Failed to list layers: ${response.status} ${errorText}`);
|
|
40
|
+
}
|
|
41
|
+
const result = await response.json();
|
|
42
|
+
if (!result.success || !result.data?.layers) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// Find layer matching name and parent
|
|
46
|
+
const layer = result.data.layers.find((l) => {
|
|
47
|
+
const nameMatches = l.name.toLowerCase() === name.toLowerCase();
|
|
48
|
+
const parentMatches = parentLayerId
|
|
49
|
+
? l.parent_layer_id === parentLayerId
|
|
50
|
+
: l.parent_layer_id === null;
|
|
51
|
+
return nameMatches && parentMatches;
|
|
52
|
+
});
|
|
53
|
+
return layer || null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a layer with optional parent
|
|
57
|
+
*/
|
|
58
|
+
async function createLayer(taskboardId, name, parentLayerId) {
|
|
59
|
+
if (!WAYMAKER_API_KEY) {
|
|
60
|
+
throw new Error('WAYMAKER_API_KEY environment variable not set');
|
|
61
|
+
}
|
|
62
|
+
console.error(`[LayerResolver] Creating layer: ${name}${parentLayerId ? ` (parent: ${parentLayerId})` : ' (top-level)'}`);
|
|
63
|
+
const response = await fetch(`${WAYMAKER_APPS_URL}/functions/v1/commander-layer-operations`, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: {
|
|
66
|
+
'Authorization': `Bearer ${WAYMAKER_API_KEY}`,
|
|
67
|
+
'Content-Type': 'application/json',
|
|
68
|
+
},
|
|
69
|
+
body: JSON.stringify({
|
|
70
|
+
action: 'create-layer',
|
|
71
|
+
taskboardId,
|
|
72
|
+
name,
|
|
73
|
+
parentLayerId,
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
const errorText = await response.text();
|
|
78
|
+
throw new Error(`Failed to create layer: ${response.status} ${errorText}`);
|
|
79
|
+
}
|
|
80
|
+
const result = await response.json();
|
|
81
|
+
if (!result.success || !result.data?.layer) {
|
|
82
|
+
throw new Error(result.message || 'Failed to create layer');
|
|
83
|
+
}
|
|
84
|
+
return result.data.layer;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a layer path to an ID, creating missing parent layers as needed
|
|
88
|
+
*
|
|
89
|
+
* @param taskboardId - The taskboard to resolve layers on
|
|
90
|
+
* @param layerPath - Path like "Product/Sprint 1" or "Product"
|
|
91
|
+
* @param autoCreate - Whether to create missing layers (default: true)
|
|
92
|
+
* @returns ResolveResult with layerId, path, and creation info
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* // Resolve "Product/Sprint 1" - creates "Product" if missing, then "Sprint 1"
|
|
96
|
+
* const result = await resolveOrCreateLayerPath(taskboardId, "Product/Sprint 1");
|
|
97
|
+
* console.log(result.layerId); // UUID of "Sprint 1" layer
|
|
98
|
+
* console.log(result.created); // true if any layers were created
|
|
99
|
+
*/
|
|
100
|
+
export async function resolveOrCreateLayerPath(taskboardId, layerPath, autoCreate = true) {
|
|
101
|
+
const segments = parseLayerPath(layerPath);
|
|
102
|
+
if (segments.length === 0) {
|
|
103
|
+
throw new Error('Layer path cannot be empty');
|
|
104
|
+
}
|
|
105
|
+
console.error(`[LayerResolver] Resolving path: ${layerPath} (${segments.length} segments)`);
|
|
106
|
+
let parentId = null;
|
|
107
|
+
const createdLayers = [];
|
|
108
|
+
const resolvedPath = [];
|
|
109
|
+
for (const segment of segments) {
|
|
110
|
+
// Try to find existing layer
|
|
111
|
+
const existing = await findLayer(taskboardId, segment, parentId);
|
|
112
|
+
if (existing) {
|
|
113
|
+
console.error(`[LayerResolver] Found existing: ${segment} -> ${existing.id}`);
|
|
114
|
+
parentId = existing.id;
|
|
115
|
+
resolvedPath.push(segment);
|
|
116
|
+
}
|
|
117
|
+
else if (autoCreate) {
|
|
118
|
+
// Create missing layer
|
|
119
|
+
const created = await createLayer(taskboardId, segment, parentId);
|
|
120
|
+
console.error(`[LayerResolver] Created: ${segment} -> ${created.id}`);
|
|
121
|
+
parentId = created.id;
|
|
122
|
+
resolvedPath.push(segment);
|
|
123
|
+
createdLayers.push(segment);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
throw new Error(`Layer not found: ${segment} (in path: ${layerPath})`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
layerId: parentId,
|
|
131
|
+
layerPath: resolvedPath.join('/'),
|
|
132
|
+
created: createdLayers.length > 0,
|
|
133
|
+
createdLayers,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Resolve a layer path without creating missing layers
|
|
138
|
+
* Throws if any segment is not found
|
|
139
|
+
*/
|
|
140
|
+
export async function resolveLayerPath(taskboardId, layerPath) {
|
|
141
|
+
return resolveOrCreateLayerPath(taskboardId, layerPath, false);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get the full path for a layer ID by traversing up the parent chain
|
|
145
|
+
*/
|
|
146
|
+
export async function getLayerPath(taskboardId, layerId) {
|
|
147
|
+
if (!WAYMAKER_API_KEY) {
|
|
148
|
+
throw new Error('WAYMAKER_API_KEY environment variable not set');
|
|
149
|
+
}
|
|
150
|
+
// Fetch all layers
|
|
151
|
+
const response = await fetch(`${WAYMAKER_APPS_URL}/functions/v1/commander-layer-operations`, {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
headers: {
|
|
154
|
+
'Authorization': `Bearer ${WAYMAKER_API_KEY}`,
|
|
155
|
+
'Content-Type': 'application/json',
|
|
156
|
+
},
|
|
157
|
+
body: JSON.stringify({
|
|
158
|
+
action: 'list-layers',
|
|
159
|
+
taskboardId,
|
|
160
|
+
}),
|
|
161
|
+
});
|
|
162
|
+
if (!response.ok) {
|
|
163
|
+
throw new Error(`Failed to list layers: ${response.status}`);
|
|
164
|
+
}
|
|
165
|
+
const result = await response.json();
|
|
166
|
+
const layers = result.data?.layers || [];
|
|
167
|
+
// Build lookup map
|
|
168
|
+
const layerMap = new Map();
|
|
169
|
+
for (const layer of layers) {
|
|
170
|
+
layerMap.set(layer.id, layer);
|
|
171
|
+
}
|
|
172
|
+
// Traverse up from target layer
|
|
173
|
+
const pathSegments = [];
|
|
174
|
+
let currentId = layerId;
|
|
175
|
+
while (currentId) {
|
|
176
|
+
const layer = layerMap.get(currentId);
|
|
177
|
+
if (!layer) {
|
|
178
|
+
throw new Error(`Layer not found: ${currentId}`);
|
|
179
|
+
}
|
|
180
|
+
pathSegments.unshift(layer.name);
|
|
181
|
+
currentId = layer.parent_layer_id;
|
|
182
|
+
}
|
|
183
|
+
return pathSegments.join('/');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Validate a layer path format
|
|
187
|
+
*/
|
|
188
|
+
export function validateLayerPath(layerPath) {
|
|
189
|
+
if (!layerPath || typeof layerPath !== 'string') {
|
|
190
|
+
return { valid: false, error: 'Layer path must be a non-empty string' };
|
|
191
|
+
}
|
|
192
|
+
const segments = parseLayerPath(layerPath);
|
|
193
|
+
if (segments.length === 0) {
|
|
194
|
+
return { valid: false, error: 'Layer path has no valid segments' };
|
|
195
|
+
}
|
|
196
|
+
for (const segment of segments) {
|
|
197
|
+
if (segment.length > 100) {
|
|
198
|
+
return { valid: false, error: `Layer name too long: ${segment.substring(0, 20)}...` };
|
|
199
|
+
}
|
|
200
|
+
if (/[<>:"|?*\\]/.test(segment)) {
|
|
201
|
+
return { valid: false, error: `Invalid characters in layer name: ${segment}` };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { valid: true };
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=layer-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-resolver.js","sourceRoot":"","sources":["../../src/sync/layer-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waymaker Sync - Markdown Parser
|
|
3
|
+
* Parses markdown files with frontmatter, content, and checklist items
|
|
4
|
+
*/
|
|
5
|
+
import { ParsedMarkdown, MarkdownFrontmatter } from './types.js';
|
|
6
|
+
export declare class MarkdownParser {
|
|
7
|
+
/**
|
|
8
|
+
* Parse a markdown file with frontmatter
|
|
9
|
+
*/
|
|
10
|
+
parseFile(filePath: string): Promise<ParsedMarkdown>;
|
|
11
|
+
/**
|
|
12
|
+
* Parse markdown content string
|
|
13
|
+
*/
|
|
14
|
+
parseContent(content: string): ParsedMarkdown;
|
|
15
|
+
/**
|
|
16
|
+
* Extract checklist items from markdown content
|
|
17
|
+
* Supports: - [ ] and - [x] format
|
|
18
|
+
*/
|
|
19
|
+
private extractChecklistItems;
|
|
20
|
+
/**
|
|
21
|
+
* Extract heading structure from markdown content
|
|
22
|
+
*/
|
|
23
|
+
private extractHeadings;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a markdown file has sync frontmatter
|
|
26
|
+
*/
|
|
27
|
+
hasSyncFrontmatter(filePath: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Update frontmatter in a markdown file
|
|
30
|
+
*/
|
|
31
|
+
updateFrontmatter(filePath: string, updates: Partial<MarkdownFrontmatter>): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Deep merge frontmatter objects
|
|
34
|
+
*/
|
|
35
|
+
private mergeFrontmatter;
|
|
36
|
+
/**
|
|
37
|
+
* Calculate content checksum for change detection
|
|
38
|
+
*/
|
|
39
|
+
calculateChecksum(content: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Extract task metadata from frontmatter
|
|
42
|
+
*/
|
|
43
|
+
extractTaskMetadata(frontmatter: MarkdownFrontmatter): Record<string, any>;
|
|
44
|
+
/**
|
|
45
|
+
* Get title from markdown content or frontmatter
|
|
46
|
+
*/
|
|
47
|
+
getTitle(parsed: ParsedMarkdown): string;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=markdown-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/sync/markdown-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,cAAc,EACd,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAc;IACzB;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAY1D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAmB7C;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5D;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAW1C;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA8B1E;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAgBzC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waymaker Sync - Markdown Parser
|
|
3
|
+
* Parses markdown files with frontmatter, content, and checklist items
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import matter from 'gray-matter';
|
|
7
|
+
export class MarkdownParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse a markdown file with frontmatter
|
|
10
|
+
*/
|
|
11
|
+
async parseFile(filePath) {
|
|
12
|
+
try {
|
|
13
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
14
|
+
return this.parseContent(fileContent);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof Error) {
|
|
18
|
+
throw new Error(`Failed to parse file ${filePath}: ${error.message}`);
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse markdown content string
|
|
25
|
+
*/
|
|
26
|
+
parseContent(content) {
|
|
27
|
+
// Parse frontmatter using gray-matter
|
|
28
|
+
const { data, content: markdownContent, matter: rawFrontmatter } = matter(content);
|
|
29
|
+
// Extract checklist items
|
|
30
|
+
const checklistItems = this.extractChecklistItems(markdownContent);
|
|
31
|
+
// Extract heading structure
|
|
32
|
+
const headings = this.extractHeadings(markdownContent);
|
|
33
|
+
return {
|
|
34
|
+
frontmatter: data,
|
|
35
|
+
content: markdownContent,
|
|
36
|
+
checklistItems,
|
|
37
|
+
headings,
|
|
38
|
+
rawFrontmatter: rawFrontmatter || '',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extract checklist items from markdown content
|
|
43
|
+
* Supports: - [ ] and - [x] format
|
|
44
|
+
*/
|
|
45
|
+
extractChecklistItems(content) {
|
|
46
|
+
const checklistItems = [];
|
|
47
|
+
const lines = content.split('\n');
|
|
48
|
+
lines.forEach((line, index) => {
|
|
49
|
+
// Match checklist pattern: - [ ] or - [x]
|
|
50
|
+
const checklistMatch = line.match(/^(\s*)- \[([ xX])\] (.+)$/);
|
|
51
|
+
if (checklistMatch) {
|
|
52
|
+
const [, indent, check, text] = checklistMatch;
|
|
53
|
+
const level = Math.floor(indent.length / 2); // 2 spaces per level
|
|
54
|
+
const completed = check.toLowerCase() === 'x';
|
|
55
|
+
checklistItems.push({
|
|
56
|
+
text: text.trim(),
|
|
57
|
+
completed,
|
|
58
|
+
level,
|
|
59
|
+
line: index + 1,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return checklistItems;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Extract heading structure from markdown content
|
|
67
|
+
*/
|
|
68
|
+
extractHeadings(content) {
|
|
69
|
+
const headings = [];
|
|
70
|
+
const lines = content.split('\n');
|
|
71
|
+
lines.forEach((line, index) => {
|
|
72
|
+
// Match heading pattern: # Heading
|
|
73
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
74
|
+
if (headingMatch) {
|
|
75
|
+
const [, hashes, text] = headingMatch;
|
|
76
|
+
const level = hashes.length;
|
|
77
|
+
headings.push({
|
|
78
|
+
level,
|
|
79
|
+
text: text.trim(),
|
|
80
|
+
line: index + 1,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return headings;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if a markdown file has sync frontmatter
|
|
88
|
+
*/
|
|
89
|
+
async hasSyncFrontmatter(filePath) {
|
|
90
|
+
try {
|
|
91
|
+
const parsed = await this.parseFile(filePath);
|
|
92
|
+
return !!parsed.frontmatter.sync;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Update frontmatter in a markdown file
|
|
100
|
+
*/
|
|
101
|
+
async updateFrontmatter(filePath, updates) {
|
|
102
|
+
try {
|
|
103
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
104
|
+
const { data, content } = matter(fileContent);
|
|
105
|
+
// Deep merge frontmatter
|
|
106
|
+
const updatedFrontmatter = this.mergeFrontmatter(data, updates);
|
|
107
|
+
// Reconstruct file with updated frontmatter
|
|
108
|
+
const updatedContent = matter.stringify(content, updatedFrontmatter);
|
|
109
|
+
// Write back to file
|
|
110
|
+
fs.writeFileSync(filePath, updatedContent, 'utf-8');
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (error instanceof Error) {
|
|
114
|
+
throw new Error(`Failed to update frontmatter in ${filePath}: ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Deep merge frontmatter objects
|
|
121
|
+
*/
|
|
122
|
+
mergeFrontmatter(existing, updates) {
|
|
123
|
+
const merged = { ...existing };
|
|
124
|
+
// Handle sync field specially (deep merge)
|
|
125
|
+
if (updates.sync) {
|
|
126
|
+
merged.sync = {
|
|
127
|
+
...(existing.sync || {}),
|
|
128
|
+
...updates.sync,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// Merge other top-level fields
|
|
132
|
+
Object.keys(updates).forEach(key => {
|
|
133
|
+
if (key !== 'sync' && updates[key] !== undefined) {
|
|
134
|
+
merged[key] = updates[key];
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return merged;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Calculate content checksum for change detection
|
|
141
|
+
*/
|
|
142
|
+
calculateChecksum(content) {
|
|
143
|
+
// Simple hash function for content comparison
|
|
144
|
+
let hash = 0;
|
|
145
|
+
for (let i = 0; i < content.length; i++) {
|
|
146
|
+
const char = content.charCodeAt(i);
|
|
147
|
+
hash = ((hash << 5) - hash) + char;
|
|
148
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
149
|
+
}
|
|
150
|
+
return hash.toString(16);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Extract task metadata from frontmatter
|
|
154
|
+
*/
|
|
155
|
+
extractTaskMetadata(frontmatter) {
|
|
156
|
+
const metadata = {};
|
|
157
|
+
if (frontmatter.sync) {
|
|
158
|
+
const sync = frontmatter.sync;
|
|
159
|
+
if (sync.status)
|
|
160
|
+
metadata.status = sync.status;
|
|
161
|
+
if (sync.priority)
|
|
162
|
+
metadata.priority = sync.priority;
|
|
163
|
+
if (sync.owner)
|
|
164
|
+
metadata.owner = sync.owner;
|
|
165
|
+
if (sync.assignee)
|
|
166
|
+
metadata.assignee = sync.assignee;
|
|
167
|
+
if (sync.tags)
|
|
168
|
+
metadata.tags = sync.tags;
|
|
169
|
+
// Include any other sync metadata
|
|
170
|
+
Object.keys(sync).forEach(key => {
|
|
171
|
+
if (!['type', 'project', 'taskboard', 'organization_id', 'workspace_id'].includes(key)) {
|
|
172
|
+
metadata[key] = sync[key];
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// Include any top-level metadata
|
|
177
|
+
Object.keys(frontmatter).forEach(key => {
|
|
178
|
+
if (key !== 'sync') {
|
|
179
|
+
metadata[key] = frontmatter[key];
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return metadata;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get title from markdown content or frontmatter
|
|
186
|
+
*/
|
|
187
|
+
getTitle(parsed) {
|
|
188
|
+
// Try frontmatter title first
|
|
189
|
+
if (parsed.frontmatter.title) {
|
|
190
|
+
return parsed.frontmatter.title;
|
|
191
|
+
}
|
|
192
|
+
// Try first H1 heading
|
|
193
|
+
const h1 = parsed.headings.find(h => h.level === 1);
|
|
194
|
+
if (h1) {
|
|
195
|
+
return h1.text;
|
|
196
|
+
}
|
|
197
|
+
// Fallback to first line of content
|
|
198
|
+
const firstLine = parsed.content.split('\n')[0];
|
|
199
|
+
return firstLine.replace(/^#+\s*/, '').trim() || 'Untitled';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=markdown-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/sync/markdown-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReverseSync: Commander → IDE Synchronization
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to Commander taskboard changes and syncs them to IDE filesystem.
|
|
5
|
+
* Part of bidirectional Waymaker Sync.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
interface ReverseSyncConfig {
|
|
9
|
+
projectPath: string;
|
|
10
|
+
taskboardId: string;
|
|
11
|
+
tasksFolder: string;
|
|
12
|
+
supabaseUrl: string;
|
|
13
|
+
supabaseKey: string;
|
|
14
|
+
syncIntervalMs: number;
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class ReverseSync extends EventEmitter {
|
|
18
|
+
private config;
|
|
19
|
+
private supabase;
|
|
20
|
+
private channel;
|
|
21
|
+
private running;
|
|
22
|
+
private fileMap;
|
|
23
|
+
private sectionMap;
|
|
24
|
+
private pendingChanges;
|
|
25
|
+
private syncTimer;
|
|
26
|
+
private reconnectAttempts;
|
|
27
|
+
private maxReconnectAttempts;
|
|
28
|
+
private reconnectTimer;
|
|
29
|
+
private supabaseToken;
|
|
30
|
+
private tokenExpiresAt;
|
|
31
|
+
private tokenRefreshTimer;
|
|
32
|
+
private recentEvents;
|
|
33
|
+
private readonly dedupeWindowMs;
|
|
34
|
+
constructor(config: ReverseSyncConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Exchange OAuth token (wm_at_*) for a Supabase-compatible JWT
|
|
37
|
+
* This allows Realtime subscriptions to pass RLS policies
|
|
38
|
+
*/
|
|
39
|
+
private exchangeTokenForSupabaseJWT;
|
|
40
|
+
/**
|
|
41
|
+
* Schedule automatic token refresh before expiry
|
|
42
|
+
*/
|
|
43
|
+
private scheduleTokenRefresh;
|
|
44
|
+
/**
|
|
45
|
+
* Start reverse sync - subscribe to task changes
|
|
46
|
+
*/
|
|
47
|
+
start(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Stop reverse sync
|
|
50
|
+
*/
|
|
51
|
+
stop(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Subscribe to Supabase realtime for task changes
|
|
54
|
+
*/
|
|
55
|
+
private subscribeToTaskChanges;
|
|
56
|
+
/**
|
|
57
|
+
* Handle reconnection with exponential backoff
|
|
58
|
+
*/
|
|
59
|
+
private handleReconnect;
|
|
60
|
+
/**
|
|
61
|
+
* Update board sync status via edge function
|
|
62
|
+
*/
|
|
63
|
+
private updateBoardSyncStatus;
|
|
64
|
+
/**
|
|
65
|
+
* Handle realtime event from Supabase
|
|
66
|
+
*/
|
|
67
|
+
private handleRealtimeEvent;
|
|
68
|
+
/**
|
|
69
|
+
* Load section mappings from database for folder organization
|
|
70
|
+
*/
|
|
71
|
+
private loadSectionMappings;
|
|
72
|
+
/**
|
|
73
|
+
* Load existing task markdown files to build task_id → file_path map
|
|
74
|
+
* Scans tasks folder and all subdirectories (section folders)
|
|
75
|
+
*/
|
|
76
|
+
private loadExistingFiles;
|
|
77
|
+
/**
|
|
78
|
+
* Load a single task file and add to file map
|
|
79
|
+
*/
|
|
80
|
+
private loadTaskFile;
|
|
81
|
+
/**
|
|
82
|
+
* Perform initial sync of all existing tasks in the taskboard
|
|
83
|
+
*
|
|
84
|
+
* IMPORTANT: This does NOT create conflict files. On startup we simply:
|
|
85
|
+
* - Create files for tasks that exist in Commander but not locally
|
|
86
|
+
* - Skip files that already exist locally (trust local state)
|
|
87
|
+
*
|
|
88
|
+
* Conflict detection only happens on LIVE Realtime events (changes while daemon runs).
|
|
89
|
+
*/
|
|
90
|
+
private performInitialSync;
|
|
91
|
+
/**
|
|
92
|
+
* Handle task change from Commander (debounced)
|
|
93
|
+
*/
|
|
94
|
+
private handleTaskChange;
|
|
95
|
+
/**
|
|
96
|
+
* Process all queued task changes
|
|
97
|
+
*/
|
|
98
|
+
private processQueuedChanges;
|
|
99
|
+
/**
|
|
100
|
+
* Sync task to file (create or update)
|
|
101
|
+
*/
|
|
102
|
+
private syncTaskToFile;
|
|
103
|
+
/**
|
|
104
|
+
* Convert task to markdown format
|
|
105
|
+
*/
|
|
106
|
+
private taskToMarkdown;
|
|
107
|
+
/**
|
|
108
|
+
* Slugify a name for use in folder/file names
|
|
109
|
+
*/
|
|
110
|
+
private slugifyName;
|
|
111
|
+
/**
|
|
112
|
+
* Generate filename from task title (slugified)
|
|
113
|
+
*/
|
|
114
|
+
private generateFilename;
|
|
115
|
+
/**
|
|
116
|
+
* Write task to markdown file
|
|
117
|
+
*/
|
|
118
|
+
private writeTaskFile;
|
|
119
|
+
/**
|
|
120
|
+
* Delete task markdown file
|
|
121
|
+
*/
|
|
122
|
+
private deleteTaskFile;
|
|
123
|
+
/**
|
|
124
|
+
* Check for conflicts between IDE file and Commander task
|
|
125
|
+
* Returns true if IDE file was modified after Commander task
|
|
126
|
+
*/
|
|
127
|
+
private checkConflict;
|
|
128
|
+
/**
|
|
129
|
+
* Get current status
|
|
130
|
+
*/
|
|
131
|
+
getStatus(): {
|
|
132
|
+
running: boolean;
|
|
133
|
+
subscribedTo: string;
|
|
134
|
+
filesTracked: number;
|
|
135
|
+
pendingChanges: number;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=reverse-sync.d.ts.map
|