light-plan 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +3181 -2
- package/assets/README.md +111 -0
- package/assets/agents/lpm-developer.md +468 -0
- package/assets/agents/lpm-planner.md +532 -0
- package/assets/harnesses/claude.yml +43 -0
- package/assets/harnesses/copilot.yml +54 -0
- package/assets/harnesses/reasonix.yml +49 -0
- package/assets/hcm/light-plan.yml +45 -0
- package/assets/skills/lpm-board-health.md +243 -0
- package/assets/skills/lpm-board-setup.md +354 -0
- package/assets/skills/lpm-delivery.md +344 -0
- package/assets/skills/lpm-planning.md +411 -0
- package/assets/skills/lpm-templates.md +144 -0
- package/assets/skills/lpm.md +267 -0
- package/dist/cli/agent-view.d.ts +27 -0
- package/dist/cli/agent-view.js +247 -0
- package/dist/cli/agent-view.js.map +1 -0
- package/dist/cli/commands/agent/assets.d.ts +64 -0
- package/dist/cli/commands/agent/assets.js +106 -0
- package/dist/cli/commands/agent/assets.js.map +1 -0
- package/dist/cli/commands/agent/glob.d.ts +25 -0
- package/dist/cli/commands/agent/glob.js +82 -0
- package/dist/cli/commands/agent/glob.js.map +1 -0
- package/dist/cli/commands/agent/index.d.ts +11 -0
- package/dist/cli/commands/agent/index.js +284 -0
- package/dist/cli/commands/agent/index.js.map +1 -0
- package/dist/cli/commands/agent/install.d.ts +59 -0
- package/dist/cli/commands/agent/install.js +131 -0
- package/dist/cli/commands/agent/install.js.map +1 -0
- package/dist/cli/commands/agent/mapping.d.ts +175 -0
- package/dist/cli/commands/agent/mapping.js +256 -0
- package/dist/cli/commands/agent/mapping.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.js +81 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/comment.d.ts +2 -0
- package/dist/cli/commands/comment.js +104 -0
- package/dist/cli/commands/comment.js.map +1 -0
- package/dist/cli/commands/convert.d.ts +2 -0
- package/dist/cli/commands/convert.js +115 -0
- package/dist/cli/commands/convert.js.map +1 -0
- package/dist/cli/commands/copy.d.ts +2 -0
- package/dist/cli/commands/copy.js +69 -0
- package/dist/cli/commands/copy.js.map +1 -0
- package/dist/cli/commands/export.d.ts +11 -0
- package/dist/cli/commands/export.js +226 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/flag.d.ts +2 -0
- package/dist/cli/commands/flag.js +172 -0
- package/dist/cli/commands/flag.js.map +1 -0
- package/dist/cli/commands/git.d.ts +11 -0
- package/dist/cli/commands/git.js +357 -0
- package/dist/cli/commands/git.js.map +1 -0
- package/dist/cli/commands/hcm/bundle.d.ts +60 -0
- package/dist/cli/commands/hcm/bundle.js +166 -0
- package/dist/cli/commands/hcm/bundle.js.map +1 -0
- package/dist/cli/commands/hcm/index.d.ts +11 -0
- package/dist/cli/commands/hcm/index.js +162 -0
- package/dist/cli/commands/hcm/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +81 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/insert.d.ts +2 -0
- package/dist/cli/commands/insert.js +70 -0
- package/dist/cli/commands/insert.js.map +1 -0
- package/dist/cli/commands/instructions.d.ts +7 -0
- package/dist/cli/commands/instructions.js +256 -0
- package/dist/cli/commands/instructions.js.map +1 -0
- package/dist/cli/commands/link.d.ts +2 -0
- package/dist/cli/commands/link.js +121 -0
- package/dist/cli/commands/link.js.map +1 -0
- package/dist/cli/commands/mcp/config.d.ts +71 -0
- package/dist/cli/commands/mcp/config.js +119 -0
- package/dist/cli/commands/mcp/config.js.map +1 -0
- package/dist/cli/commands/mcp/index.d.ts +9 -0
- package/dist/cli/commands/mcp/index.js +92 -0
- package/dist/cli/commands/mcp/index.js.map +1 -0
- package/dist/cli/commands/mcp/serve.d.ts +1 -0
- package/dist/cli/commands/mcp/serve.js +76 -0
- package/dist/cli/commands/mcp/serve.js.map +1 -0
- package/dist/cli/commands/mcp/setup.d.ts +1 -0
- package/dist/cli/commands/mcp/setup.js +83 -0
- package/dist/cli/commands/mcp/setup.js.map +1 -0
- package/dist/cli/commands/me.d.ts +2 -0
- package/dist/cli/commands/me.js +85 -0
- package/dist/cli/commands/me.js.map +1 -0
- package/dist/cli/commands/move.d.ts +2 -0
- package/dist/cli/commands/move.js +81 -0
- package/dist/cli/commands/move.js.map +1 -0
- package/dist/cli/commands/new.d.ts +2 -0
- package/dist/cli/commands/new.js +222 -0
- package/dist/cli/commands/new.js.map +1 -0
- package/dist/cli/commands/open.d.ts +2 -0
- package/dist/cli/commands/open.js +43 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/period.d.ts +10 -0
- package/dist/cli/commands/period.js +165 -0
- package/dist/cli/commands/period.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +2 -0
- package/dist/cli/commands/profile.js +133 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/queue.d.ts +2 -0
- package/dist/cli/commands/queue.js +582 -0
- package/dist/cli/commands/queue.js.map +1 -0
- package/dist/cli/commands/remote.d.ts +10 -0
- package/dist/cli/commands/remote.js +3142 -0
- package/dist/cli/commands/remote.js.map +1 -0
- package/dist/cli/commands/rm.d.ts +2 -0
- package/dist/cli/commands/rm.js +63 -0
- package/dist/cli/commands/rm.js.map +1 -0
- package/dist/cli/commands/set.d.ts +2 -0
- package/dist/cli/commands/set.js +139 -0
- package/dist/cli/commands/set.js.map +1 -0
- package/dist/cli/commands/split.d.ts +2 -0
- package/dist/cli/commands/split.js +90 -0
- package/dist/cli/commands/split.js.map +1 -0
- package/dist/cli/commands/task.d.ts +2 -0
- package/dist/cli/commands/task.js +298 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +2 -0
- package/dist/cli/commands/team.js +114 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/template.d.ts +2 -0
- package/dist/cli/commands/template.js +338 -0
- package/dist/cli/commands/template.js.map +1 -0
- package/dist/cli/commands/ui.d.ts +2 -0
- package/dist/cli/commands/ui.js +98 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/upstream.d.ts +2 -0
- package/dist/cli/commands/upstream.js +218 -0
- package/dist/cli/commands/upstream.js.map +1 -0
- package/dist/cli/context.d.ts +24 -0
- package/dist/cli/context.js +52 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +208 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/live.d.ts +71 -0
- package/dist/cli/live.js +182 -0
- package/dist/cli/live.js.map +1 -0
- package/dist/cli/plan.d.ts +28 -0
- package/dist/cli/plan.js +76 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/prompt.d.ts +60 -0
- package/dist/cli/prompt.js +185 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/ui.d.ts +65 -0
- package/dist/cli/ui.js +79 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/core/board/dependency-rollup.d.ts +54 -0
- package/dist/core/board/dependency-rollup.js +72 -0
- package/dist/core/board/dependency-rollup.js.map +1 -0
- package/dist/core/board/flag-rollup.d.ts +33 -0
- package/dist/core/board/flag-rollup.js +56 -0
- package/dist/core/board/flag-rollup.js.map +1 -0
- package/dist/core/board/index.d.ts +21 -0
- package/dist/core/board/index.js +22 -0
- package/dist/core/board/index.js.map +1 -0
- package/dist/core/board/load/cache.d.ts +52 -0
- package/dist/core/board/load/cache.js +105 -0
- package/dist/core/board/load/cache.js.map +1 -0
- package/dist/core/board/load/fields.d.ts +33 -0
- package/dist/core/board/load/fields.js +154 -0
- package/dist/core/board/load/fields.js.map +1 -0
- package/dist/core/board/load/scan.d.ts +39 -0
- package/dist/core/board/load/scan.js +88 -0
- package/dist/core/board/load/scan.js.map +1 -0
- package/dist/core/board/load/tree.d.ts +10 -0
- package/dist/core/board/load/tree.js +114 -0
- package/dist/core/board/load/tree.js.map +1 -0
- package/dist/core/board/load.d.ts +69 -0
- package/dist/core/board/load.js +204 -0
- package/dist/core/board/load.js.map +1 -0
- package/dist/core/board/query.d.ts +126 -0
- package/dist/core/board/query.js +291 -0
- package/dist/core/board/query.js.map +1 -0
- package/dist/core/board/registry.d.ts +51 -0
- package/dist/core/board/registry.js +98 -0
- package/dist/core/board/registry.js.map +1 -0
- package/dist/core/board/remote-scopes.d.ts +71 -0
- package/dist/core/board/remote-scopes.js +103 -0
- package/dist/core/board/remote-scopes.js.map +1 -0
- package/dist/core/board/rollup.d.ts +32 -0
- package/dist/core/board/rollup.js +67 -0
- package/dist/core/board/rollup.js.map +1 -0
- package/dist/core/board/scope.d.ts +81 -0
- package/dist/core/board/scope.js +134 -0
- package/dist/core/board/scope.js.map +1 -0
- package/dist/core/board/simulate.d.ts +138 -0
- package/dist/core/board/simulate.js +141 -0
- package/dist/core/board/simulate.js.map +1 -0
- package/dist/core/board/tasks/index.d.ts +25 -0
- package/dist/core/board/tasks/index.js +26 -0
- package/dist/core/board/tasks/index.js.map +1 -0
- package/dist/core/board/tasks/ranking.d.ts +155 -0
- package/dist/core/board/tasks/ranking.js +374 -0
- package/dist/core/board/tasks/ranking.js.map +1 -0
- package/dist/core/board/tasks/roster.d.ts +42 -0
- package/dist/core/board/tasks/roster.js +82 -0
- package/dist/core/board/tasks/roster.js.map +1 -0
- package/dist/core/board/tasks.d.ts +1 -0
- package/dist/core/board/tasks.js +2 -0
- package/dist/core/board/tasks.js.map +1 -0
- package/dist/core/config/index.d.ts +9 -0
- package/dist/core/config/index.js +10 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/config/lookup.d.ts +114 -0
- package/dist/core/config/lookup.js +221 -0
- package/dist/core/config/lookup.js.map +1 -0
- package/dist/core/config/remote-blocks.d.ts +17 -0
- package/dist/core/config/remote-blocks.js +47 -0
- package/dist/core/config/remote-blocks.js.map +1 -0
- package/dist/core/config/schema.d.ts +10 -0
- package/dist/core/config/schema.js +451 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/errors.d.ts +23 -0
- package/dist/core/errors.js +31 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/gitsync/hosts.d.ts +40 -0
- package/dist/core/gitsync/hosts.js +115 -0
- package/dist/core/gitsync/hosts.js.map +1 -0
- package/dist/core/gitsync/index.d.ts +25 -0
- package/dist/core/gitsync/index.js +25 -0
- package/dist/core/gitsync/index.js.map +1 -0
- package/dist/core/gitsync/integrate.d.ts +72 -0
- package/dist/core/gitsync/integrate.js +115 -0
- package/dist/core/gitsync/integrate.js.map +1 -0
- package/dist/core/gitsync/repo.d.ts +61 -0
- package/dist/core/gitsync/repo.js +213 -0
- package/dist/core/gitsync/repo.js.map +1 -0
- package/dist/core/gitsync/run.d.ts +58 -0
- package/dist/core/gitsync/run.js +102 -0
- package/dist/core/gitsync/run.js.map +1 -0
- package/dist/core/gitsync/status.d.ts +59 -0
- package/dist/core/gitsync/status.js +81 -0
- package/dist/core/gitsync/status.js.map +1 -0
- package/dist/core/gitsync/sync.d.ts +111 -0
- package/dist/core/gitsync/sync.js +275 -0
- package/dist/core/gitsync/sync.js.map +1 -0
- package/dist/core/index.d.ts +31 -0
- package/dist/core/index.js +32 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/instructions/analyze.d.ts +70 -0
- package/dist/core/instructions/analyze.js +275 -0
- package/dist/core/instructions/analyze.js.map +1 -0
- package/dist/core/instructions/builtin.d.ts +21 -0
- package/dist/core/instructions/builtin.js +133 -0
- package/dist/core/instructions/builtin.js.map +1 -0
- package/dist/core/instructions/context.d.ts +155 -0
- package/dist/core/instructions/context.js +209 -0
- package/dist/core/instructions/context.js.map +1 -0
- package/dist/core/instructions/index.d.ts +29 -0
- package/dist/core/instructions/index.js +30 -0
- package/dist/core/instructions/index.js.map +1 -0
- package/dist/core/instructions/instructions.d.ts +90 -0
- package/dist/core/instructions/instructions.js +179 -0
- package/dist/core/instructions/instructions.js.map +1 -0
- package/dist/core/instructions/template.d.ts +108 -0
- package/dist/core/instructions/template.js +252 -0
- package/dist/core/instructions/template.js.map +1 -0
- package/dist/core/model/attributes.d.ts +16 -0
- package/dist/core/model/attributes.js +119 -0
- package/dist/core/model/attributes.js.map +1 -0
- package/dist/core/model/index.d.ts +10 -0
- package/dist/core/model/index.js +11 -0
- package/dist/core/model/index.js.map +1 -0
- package/dist/core/model/links.d.ts +34 -0
- package/dist/core/model/links.js +114 -0
- package/dist/core/model/links.js.map +1 -0
- package/dist/core/model/profile.d.ts +31 -0
- package/dist/core/model/profile.js +8 -0
- package/dist/core/model/profile.js.map +1 -0
- package/dist/core/model/types.d.ts +441 -0
- package/dist/core/model/types.js +167 -0
- package/dist/core/model/types.js.map +1 -0
- package/dist/core/model/zod.d.ts +6 -0
- package/dist/core/model/zod.js +11 -0
- package/dist/core/model/zod.js.map +1 -0
- package/dist/core/operations/board-index.d.ts +45 -0
- package/dist/core/operations/board-index.js +147 -0
- package/dist/core/operations/board-index.js.map +1 -0
- package/dist/core/operations/claim.d.ts +69 -0
- package/dist/core/operations/claim.js +115 -0
- package/dist/core/operations/claim.js.map +1 -0
- package/dist/core/operations/comment.d.ts +30 -0
- package/dist/core/operations/comment.js +46 -0
- package/dist/core/operations/comment.js.map +1 -0
- package/dist/core/operations/create.d.ts +82 -0
- package/dist/core/operations/create.js +306 -0
- package/dist/core/operations/create.js.map +1 -0
- package/dist/core/operations/flag.d.ts +58 -0
- package/dist/core/operations/flag.js +95 -0
- package/dist/core/operations/flag.js.map +1 -0
- package/dist/core/operations/git-sync.d.ts +148 -0
- package/dist/core/operations/git-sync.js +341 -0
- package/dist/core/operations/git-sync.js.map +1 -0
- package/dist/core/operations/index.d.ts +44 -0
- package/dist/core/operations/index.js +45 -0
- package/dist/core/operations/index.js.map +1 -0
- package/dist/core/operations/init.d.ts +25 -0
- package/dist/core/operations/init.js +122 -0
- package/dist/core/operations/init.js.map +1 -0
- package/dist/core/operations/link.d.ts +40 -0
- package/dist/core/operations/link.js +131 -0
- package/dist/core/operations/link.js.map +1 -0
- package/dist/core/operations/move.d.ts +43 -0
- package/dist/core/operations/move.js +103 -0
- package/dist/core/operations/move.js.map +1 -0
- package/dist/core/operations/profile.d.ts +23 -0
- package/dist/core/operations/profile.js +26 -0
- package/dist/core/operations/profile.js.map +1 -0
- package/dist/core/operations/remotes-off.d.ts +12 -0
- package/dist/core/operations/remotes-off.js +67 -0
- package/dist/core/operations/remotes-off.js.map +1 -0
- package/dist/core/operations/remove.d.ts +18 -0
- package/dist/core/operations/remove.js +114 -0
- package/dist/core/operations/remove.js.map +1 -0
- package/dist/core/operations/retype.d.ts +25 -0
- package/dist/core/operations/retype.js +59 -0
- package/dist/core/operations/retype.js.map +1 -0
- package/dist/core/operations/rollup.d.ts +74 -0
- package/dist/core/operations/rollup.js +121 -0
- package/dist/core/operations/rollup.js.map +1 -0
- package/dist/core/operations/shared.d.ts +133 -0
- package/dist/core/operations/shared.js +383 -0
- package/dist/core/operations/shared.js.map +1 -0
- package/dist/core/operations/update.d.ts +43 -0
- package/dist/core/operations/update.js +161 -0
- package/dist/core/operations/update.js.map +1 -0
- package/dist/core/operations/user.d.ts +27 -0
- package/dist/core/operations/user.js +68 -0
- package/dist/core/operations/user.js.map +1 -0
- package/dist/core/profile/current.d.ts +35 -0
- package/dist/core/profile/current.js +31 -0
- package/dist/core/profile/current.js.map +1 -0
- package/dist/core/profile/index.d.ts +14 -0
- package/dist/core/profile/index.js +15 -0
- package/dist/core/profile/index.js.map +1 -0
- package/dist/core/profile/schema.d.ts +9 -0
- package/dist/core/profile/schema.js +100 -0
- package/dist/core/profile/schema.js.map +1 -0
- package/dist/core/storage/activity.d.ts +78 -0
- package/dist/core/storage/activity.js +131 -0
- package/dist/core/storage/activity.js.map +1 -0
- package/dist/core/storage/atomic.d.ts +34 -0
- package/dist/core/storage/atomic.js +117 -0
- package/dist/core/storage/atomic.js.map +1 -0
- package/dist/core/storage/comments.d.ts +39 -0
- package/dist/core/storage/comments.js +88 -0
- package/dist/core/storage/comments.js.map +1 -0
- package/dist/core/storage/document.d.ts +16 -0
- package/dist/core/storage/document.js +98 -0
- package/dist/core/storage/document.js.map +1 -0
- package/dist/core/storage/frontmatter.d.ts +16 -0
- package/dist/core/storage/frontmatter.js +33 -0
- package/dist/core/storage/frontmatter.js.map +1 -0
- package/dist/core/storage/git.d.ts +8 -0
- package/dist/core/storage/git.js +48 -0
- package/dist/core/storage/git.js.map +1 -0
- package/dist/core/storage/index.d.ts +27 -0
- package/dist/core/storage/index.js +28 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/storage/local.d.ts +57 -0
- package/dist/core/storage/local.js +133 -0
- package/dist/core/storage/local.js.map +1 -0
- package/dist/core/storage/lock.d.ts +85 -0
- package/dist/core/storage/lock.js +364 -0
- package/dist/core/storage/lock.js.map +1 -0
- package/dist/core/storage/paths.d.ts +125 -0
- package/dist/core/storage/paths.js +202 -0
- package/dist/core/storage/paths.js.map +1 -0
- package/dist/core/storage/state.d.ts +32 -0
- package/dist/core/storage/state.js +71 -0
- package/dist/core/storage/state.js.map +1 -0
- package/dist/core/storage/templates.d.ts +29 -0
- package/dist/core/storage/templates.js +62 -0
- package/dist/core/storage/templates.js.map +1 -0
- package/dist/core/storage/views.d.ts +18 -0
- package/dist/core/storage/views.js +62 -0
- package/dist/core/storage/views.js.map +1 -0
- package/dist/core/validation/check.d.ts +4 -0
- package/dist/core/validation/check.js +22 -0
- package/dist/core/validation/check.js.map +1 -0
- package/dist/core/validation/checks/collection.d.ts +4 -0
- package/dist/core/validation/checks/collection.js +152 -0
- package/dist/core/validation/checks/collection.js.map +1 -0
- package/dist/core/validation/checks/counters.d.ts +3 -0
- package/dist/core/validation/checks/counters.js +23 -0
- package/dist/core/validation/checks/counters.js.map +1 -0
- package/dist/core/validation/checks/dependencies.d.ts +3 -0
- package/dist/core/validation/checks/dependencies.js +58 -0
- package/dist/core/validation/checks/dependencies.js.map +1 -0
- package/dist/core/validation/checks/gitignore.d.ts +10 -0
- package/dist/core/validation/checks/gitignore.js +22 -0
- package/dist/core/validation/checks/gitignore.js.map +1 -0
- package/dist/core/validation/checks/index-file.d.ts +8 -0
- package/dist/core/validation/checks/index-file.js +26 -0
- package/dist/core/validation/checks/index-file.js.map +1 -0
- package/dist/core/validation/checks/index.d.ts +20 -0
- package/dist/core/validation/checks/index.js +21 -0
- package/dist/core/validation/checks/index.js.map +1 -0
- package/dist/core/validation/checks/issues.d.ts +3 -0
- package/dist/core/validation/checks/issues.js +152 -0
- package/dist/core/validation/checks/issues.js.map +1 -0
- package/dist/core/validation/checks/periods.d.ts +3 -0
- package/dist/core/validation/checks/periods.js +89 -0
- package/dist/core/validation/checks/periods.js.map +1 -0
- package/dist/core/validation/checks/remotes.d.ts +20 -0
- package/dist/core/validation/checks/remotes.js +42 -0
- package/dist/core/validation/checks/remotes.js.map +1 -0
- package/dist/core/validation/checks/resources.d.ts +3 -0
- package/dist/core/validation/checks/resources.js +77 -0
- package/dist/core/validation/checks/resources.js.map +1 -0
- package/dist/core/validation/checks/rollup.d.ts +27 -0
- package/dist/core/validation/checks/rollup.js +53 -0
- package/dist/core/validation/checks/rollup.js.map +1 -0
- package/dist/core/validation/checks/squads.d.ts +3 -0
- package/dist/core/validation/checks/squads.js +42 -0
- package/dist/core/validation/checks/squads.js.map +1 -0
- package/dist/core/validation/checks/templates.d.ts +14 -0
- package/dist/core/validation/checks/templates.js +119 -0
- package/dist/core/validation/checks/templates.js.map +1 -0
- package/dist/core/validation/fix.d.ts +7 -0
- package/dist/core/validation/fix.js +273 -0
- package/dist/core/validation/fix.js.map +1 -0
- package/dist/core/validation/index.d.ts +7 -0
- package/dist/core/validation/index.js +8 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/core/validation/shared.d.ts +47 -0
- package/dist/core/validation/shared.js +66 -0
- package/dist/core/validation/shared.js.map +1 -0
- package/dist/mcp/context.d.ts +70 -0
- package/dist/mcp/context.js +110 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/index.d.ts +49 -0
- package/dist/mcp/index.js +90 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/reply.d.ts +28 -0
- package/dist/mcp/reply.js +34 -0
- package/dist/mcp/reply.js.map +1 -0
- package/dist/mcp/tools/plan/create.d.ts +3 -0
- package/dist/mcp/tools/plan/create.js +128 -0
- package/dist/mcp/tools/plan/create.js.map +1 -0
- package/dist/mcp/tools/plan/delete.d.ts +3 -0
- package/dist/mcp/tools/plan/delete.js +35 -0
- package/dist/mcp/tools/plan/delete.js.map +1 -0
- package/dist/mcp/tools/plan/graph.d.ts +3 -0
- package/dist/mcp/tools/plan/graph.js +53 -0
- package/dist/mcp/tools/plan/graph.js.map +1 -0
- package/dist/mcp/tools/plan/index.d.ts +15 -0
- package/dist/mcp/tools/plan/index.js +16 -0
- package/dist/mcp/tools/plan/index.js.map +1 -0
- package/dist/mcp/tools/plan/link.d.ts +3 -0
- package/dist/mcp/tools/plan/link.js +46 -0
- package/dist/mcp/tools/plan/link.js.map +1 -0
- package/dist/mcp/tools/plan/registrar.d.ts +10 -0
- package/dist/mcp/tools/plan/registrar.js +24 -0
- package/dist/mcp/tools/plan/registrar.js.map +1 -0
- package/dist/mcp/tools/plan/reshape.d.ts +3 -0
- package/dist/mcp/tools/plan/reshape.js +95 -0
- package/dist/mcp/tools/plan/reshape.js.map +1 -0
- package/dist/mcp/tools/plan/timeline.d.ts +3 -0
- package/dist/mcp/tools/plan/timeline.js +68 -0
- package/dist/mcp/tools/plan/timeline.js.map +1 -0
- package/dist/mcp/tools/plan/upstream.d.ts +14 -0
- package/dist/mcp/tools/plan/upstream.js +69 -0
- package/dist/mcp/tools/plan/upstream.js.map +1 -0
- package/dist/mcp/tools/plan.d.ts +1 -0
- package/dist/mcp/tools/plan.js +2 -0
- package/dist/mcp/tools/plan.js.map +1 -0
- package/dist/mcp/tools/read.d.ts +3 -0
- package/dist/mcp/tools/read.js +339 -0
- package/dist/mcp/tools/read.js.map +1 -0
- package/dist/mcp/tools/remote.d.ts +3 -0
- package/dist/mcp/tools/remote.js +254 -0
- package/dist/mcp/tools/remote.js.map +1 -0
- package/dist/mcp/tools/templates.d.ts +12 -0
- package/dist/mcp/tools/templates.js +165 -0
- package/dist/mcp/tools/templates.js.map +1 -0
- package/dist/mcp/tools/work.d.ts +16 -0
- package/dist/mcp/tools/work.js +359 -0
- package/dist/mcp/tools/work.js.map +1 -0
- package/dist/remote/accounts.d.ts +158 -0
- package/dist/remote/accounts.js +207 -0
- package/dist/remote/accounts.js.map +1 -0
- package/dist/remote/adopt.d.ts +139 -0
- package/dist/remote/adopt.js +181 -0
- package/dist/remote/adopt.js.map +1 -0
- package/dist/remote/anchor.d.ts +35 -0
- package/dist/remote/anchor.js +53 -0
- package/dist/remote/anchor.js.map +1 -0
- package/dist/remote/attributes.d.ts +103 -0
- package/dist/remote/attributes.js +245 -0
- package/dist/remote/attributes.js.map +1 -0
- package/dist/remote/audit.d.ts +112 -0
- package/dist/remote/audit.js +215 -0
- package/dist/remote/audit.js.map +1 -0
- package/dist/remote/capabilities.d.ts +267 -0
- package/dist/remote/capabilities.js +225 -0
- package/dist/remote/capabilities.js.map +1 -0
- package/dist/remote/check.d.ts +49 -0
- package/dist/remote/check.js +356 -0
- package/dist/remote/check.js.map +1 -0
- package/dist/remote/comments.d.ts +86 -0
- package/dist/remote/comments.js +87 -0
- package/dist/remote/comments.js.map +1 -0
- package/dist/remote/config-file.d.ts +237 -0
- package/dist/remote/config-file.js +640 -0
- package/dist/remote/config-file.js.map +1 -0
- package/dist/remote/conflicts.d.ts +110 -0
- package/dist/remote/conflicts.js +188 -0
- package/dist/remote/conflicts.js.map +1 -0
- package/dist/remote/connection-catalogue.d.ts +65 -0
- package/dist/remote/connection-catalogue.js +66 -0
- package/dist/remote/connection-catalogue.js.map +1 -0
- package/dist/remote/connection.d.ts +84 -0
- package/dist/remote/connection.js +229 -0
- package/dist/remote/connection.js.map +1 -0
- package/dist/remote/coverage.d.ts +65 -0
- package/dist/remote/coverage.js +244 -0
- package/dist/remote/coverage.js.map +1 -0
- package/dist/remote/credentials.d.ts +95 -0
- package/dist/remote/credentials.js +210 -0
- package/dist/remote/credentials.js.map +1 -0
- package/dist/remote/execute.d.ts +178 -0
- package/dist/remote/execute.js +1245 -0
- package/dist/remote/execute.js.map +1 -0
- package/dist/remote/fingerprint.d.ts +172 -0
- package/dist/remote/fingerprint.js +337 -0
- package/dist/remote/fingerprint.js.map +1 -0
- package/dist/remote/fixtures.d.ts +176 -0
- package/dist/remote/fixtures.js +432 -0
- package/dist/remote/fixtures.js.map +1 -0
- package/dist/remote/guard.d.ts +90 -0
- package/dist/remote/guard.js +83 -0
- package/dist/remote/guard.js.map +1 -0
- package/dist/remote/hierarchy.d.ts +141 -0
- package/dist/remote/hierarchy.js +129 -0
- package/dist/remote/hierarchy.js.map +1 -0
- package/dist/remote/index.d.ts +145 -0
- package/dist/remote/index.js +146 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/remote/inspect.d.ts +103 -0
- package/dist/remote/inspect.js +152 -0
- package/dist/remote/inspect.js.map +1 -0
- package/dist/remote/labels.d.ts +75 -0
- package/dist/remote/labels.js +137 -0
- package/dist/remote/labels.js.map +1 -0
- package/dist/remote/ladder.d.ts +145 -0
- package/dist/remote/ladder.js +387 -0
- package/dist/remote/ladder.js.map +1 -0
- package/dist/remote/ledger.d.ts +97 -0
- package/dist/remote/ledger.js +148 -0
- package/dist/remote/ledger.js.map +1 -0
- package/dist/remote/lifecycle.d.ts +175 -0
- package/dist/remote/lifecycle.js +274 -0
- package/dist/remote/lifecycle.js.map +1 -0
- package/dist/remote/links.d.ts +411 -0
- package/dist/remote/links.js +748 -0
- package/dist/remote/links.js.map +1 -0
- package/dist/remote/managed-block.d.ts +182 -0
- package/dist/remote/managed-block.js +406 -0
- package/dist/remote/managed-block.js.map +1 -0
- package/dist/remote/managed-comment.d.ts +104 -0
- package/dist/remote/managed-comment.js +92 -0
- package/dist/remote/managed-comment.js.map +1 -0
- package/dist/remote/mapping.d.ts +282 -0
- package/dist/remote/mapping.js +336 -0
- package/dist/remote/mapping.js.map +1 -0
- package/dist/remote/merge.d.ts +172 -0
- package/dist/remote/merge.js +221 -0
- package/dist/remote/merge.js.map +1 -0
- package/dist/remote/periods.d.ts +209 -0
- package/dist/remote/periods.js +224 -0
- package/dist/remote/periods.js.map +1 -0
- package/dist/remote/plan.d.ts +671 -0
- package/dist/remote/plan.js +1210 -0
- package/dist/remote/plan.js.map +1 -0
- package/dist/remote/policy.d.ts +67 -0
- package/dist/remote/policy.js +67 -0
- package/dist/remote/policy.js.map +1 -0
- package/dist/remote/preflight.d.ts +112 -0
- package/dist/remote/preflight.js +342 -0
- package/dist/remote/preflight.js.map +1 -0
- package/dist/remote/prerequisites.d.ts +113 -0
- package/dist/remote/prerequisites.js +161 -0
- package/dist/remote/prerequisites.js.map +1 -0
- package/dist/remote/provider.d.ts +802 -0
- package/dist/remote/provider.js +27 -0
- package/dist/remote/provider.js.map +1 -0
- package/dist/remote/providers/github/config.d.ts +84 -0
- package/dist/remote/providers/github/config.js +161 -0
- package/dist/remote/providers/github/config.js.map +1 -0
- package/dist/remote/providers/github/connector.d.ts +33 -0
- package/dist/remote/providers/github/connector.js +774 -0
- package/dist/remote/providers/github/connector.js.map +1 -0
- package/dist/remote/providers/github/edges.d.ts +29 -0
- package/dist/remote/providers/github/edges.js +56 -0
- package/dist/remote/providers/github/edges.js.map +1 -0
- package/dist/remote/providers/github/hierarchy.d.ts +21 -0
- package/dist/remote/providers/github/hierarchy.js +46 -0
- package/dist/remote/providers/github/hierarchy.js.map +1 -0
- package/dist/remote/providers/github/index.d.ts +26 -0
- package/dist/remote/providers/github/index.js +69 -0
- package/dist/remote/providers/github/index.js.map +1 -0
- package/dist/remote/providers/github/project-iteration.d.ts +71 -0
- package/dist/remote/providers/github/project-iteration.js +203 -0
- package/dist/remote/providers/github/project-iteration.js.map +1 -0
- package/dist/remote/providers/github/project-provision.d.ts +130 -0
- package/dist/remote/providers/github/project-provision.js +247 -0
- package/dist/remote/providers/github/project-provision.js.map +1 -0
- package/dist/remote/providers/github/project-status.d.ts +115 -0
- package/dist/remote/providers/github/project-status.js +317 -0
- package/dist/remote/providers/github/project-status.js.map +1 -0
- package/dist/remote/providers/github/projects.d.ts +181 -0
- package/dist/remote/providers/github/projects.js +481 -0
- package/dist/remote/providers/github/projects.js.map +1 -0
- package/dist/remote/providers/github/translator.d.ts +103 -0
- package/dist/remote/providers/github/translator.js +400 -0
- package/dist/remote/providers/github/translator.js.map +1 -0
- package/dist/remote/providers/jira/config.d.ts +96 -0
- package/dist/remote/providers/jira/config.js +200 -0
- package/dist/remote/providers/jira/config.js.map +1 -0
- package/dist/remote/providers/jira/connector.d.ts +42 -0
- package/dist/remote/providers/jira/connector.js +1688 -0
- package/dist/remote/providers/jira/connector.js.map +1 -0
- package/dist/remote/providers/jira/fields.d.ts +292 -0
- package/dist/remote/providers/jira/fields.js +463 -0
- package/dist/remote/providers/jira/fields.js.map +1 -0
- package/dist/remote/providers/jira/hierarchy.d.ts +28 -0
- package/dist/remote/providers/jira/hierarchy.js +60 -0
- package/dist/remote/providers/jira/hierarchy.js.map +1 -0
- package/dist/remote/providers/jira/index.d.ts +29 -0
- package/dist/remote/providers/jira/index.js +100 -0
- package/dist/remote/providers/jira/index.js.map +1 -0
- package/dist/remote/providers/jira/links.d.ts +41 -0
- package/dist/remote/providers/jira/links.js +102 -0
- package/dist/remote/providers/jira/links.js.map +1 -0
- package/dist/remote/providers/jira/sprints.d.ts +80 -0
- package/dist/remote/providers/jira/sprints.js +107 -0
- package/dist/remote/providers/jira/sprints.js.map +1 -0
- package/dist/remote/providers/jira/translator.d.ts +61 -0
- package/dist/remote/providers/jira/translator.js +382 -0
- package/dist/remote/providers/jira/translator.js.map +1 -0
- package/dist/remote/providers/jira/types.d.ts +112 -0
- package/dist/remote/providers/jira/types.js +160 -0
- package/dist/remote/providers/jira/types.js.map +1 -0
- package/dist/remote/providers/jira/vocabulary.d.ts +55 -0
- package/dist/remote/providers/jira/vocabulary.js +91 -0
- package/dist/remote/providers/jira/vocabulary.js.map +1 -0
- package/dist/remote/providers/jsonfile/config.d.ts +61 -0
- package/dist/remote/providers/jsonfile/config.js +83 -0
- package/dist/remote/providers/jsonfile/config.js.map +1 -0
- package/dist/remote/providers/jsonfile/connector.d.ts +34 -0
- package/dist/remote/providers/jsonfile/connector.js +251 -0
- package/dist/remote/providers/jsonfile/connector.js.map +1 -0
- package/dist/remote/providers/jsonfile/index.d.ts +38 -0
- package/dist/remote/providers/jsonfile/index.js +90 -0
- package/dist/remote/providers/jsonfile/index.js.map +1 -0
- package/dist/remote/providers/jsonfile/store.d.ts +59 -0
- package/dist/remote/providers/jsonfile/store.js +48 -0
- package/dist/remote/providers/jsonfile/store.js.map +1 -0
- package/dist/remote/providers/jsonfile/translator.d.ts +54 -0
- package/dist/remote/providers/jsonfile/translator.js +199 -0
- package/dist/remote/providers/jsonfile/translator.js.map +1 -0
- package/dist/remote/providers/linear/config.d.ts +83 -0
- package/dist/remote/providers/linear/config.js +140 -0
- package/dist/remote/providers/linear/config.js.map +1 -0
- package/dist/remote/providers/linear/connector.d.ts +36 -0
- package/dist/remote/providers/linear/connector.js +438 -0
- package/dist/remote/providers/linear/connector.js.map +1 -0
- package/dist/remote/providers/linear/estimate.d.ts +63 -0
- package/dist/remote/providers/linear/estimate.js +112 -0
- package/dist/remote/providers/linear/estimate.js.map +1 -0
- package/dist/remote/providers/linear/index.d.ts +31 -0
- package/dist/remote/providers/linear/index.js +75 -0
- package/dist/remote/providers/linear/index.js.map +1 -0
- package/dist/remote/providers/linear/labels.d.ts +51 -0
- package/dist/remote/providers/linear/labels.js +129 -0
- package/dist/remote/providers/linear/labels.js.map +1 -0
- package/dist/remote/providers/linear/states.d.ts +97 -0
- package/dist/remote/providers/linear/states.js +124 -0
- package/dist/remote/providers/linear/states.js.map +1 -0
- package/dist/remote/providers/linear/translator.d.ts +48 -0
- package/dist/remote/providers/linear/translator.js +343 -0
- package/dist/remote/providers/linear/translator.js.map +1 -0
- package/dist/remote/providers/linear/vocabulary.d.ts +27 -0
- package/dist/remote/providers/linear/vocabulary.js +42 -0
- package/dist/remote/providers/linear/vocabulary.js.map +1 -0
- package/dist/remote/provision.d.ts +45 -0
- package/dist/remote/provision.js +81 -0
- package/dist/remote/provision.js.map +1 -0
- package/dist/remote/pull.d.ts +52 -0
- package/dist/remote/pull.js +116 -0
- package/dist/remote/pull.js.map +1 -0
- package/dist/remote/readiness.d.ts +67 -0
- package/dist/remote/readiness.js +336 -0
- package/dist/remote/readiness.js.map +1 -0
- package/dist/remote/rebase.d.ts +157 -0
- package/dist/remote/rebase.js +255 -0
- package/dist/remote/rebase.js.map +1 -0
- package/dist/remote/reconcile.d.ts +115 -0
- package/dist/remote/reconcile.js +140 -0
- package/dist/remote/reconcile.js.map +1 -0
- package/dist/remote/redact.d.ts +70 -0
- package/dist/remote/redact.js +132 -0
- package/dist/remote/redact.js.map +1 -0
- package/dist/remote/registry.d.ts +32 -0
- package/dist/remote/registry.js +54 -0
- package/dist/remote/registry.js.map +1 -0
- package/dist/remote/remotes.d.ts +94 -0
- package/dist/remote/remotes.js +182 -0
- package/dist/remote/remotes.js.map +1 -0
- package/dist/remote/render.d.ts +147 -0
- package/dist/remote/render.js +683 -0
- package/dist/remote/render.js.map +1 -0
- package/dist/remote/report.d.ts +63 -0
- package/dist/remote/report.js +345 -0
- package/dist/remote/report.js.map +1 -0
- package/dist/remote/resolutions.d.ts +115 -0
- package/dist/remote/resolutions.js +217 -0
- package/dist/remote/resolutions.js.map +1 -0
- package/dist/remote/scaffold.d.ts +134 -0
- package/dist/remote/scaffold.js +370 -0
- package/dist/remote/scaffold.js.map +1 -0
- package/dist/remote/scope.d.ts +57 -0
- package/dist/remote/scope.js +91 -0
- package/dist/remote/scope.js.map +1 -0
- package/dist/remote/selection.d.ts +38 -0
- package/dist/remote/selection.js +50 -0
- package/dist/remote/selection.js.map +1 -0
- package/dist/remote/shape.d.ts +141 -0
- package/dist/remote/shape.js +220 -0
- package/dist/remote/shape.js.map +1 -0
- package/dist/remote/status.d.ts +104 -0
- package/dist/remote/status.js +238 -0
- package/dist/remote/status.js.map +1 -0
- package/dist/remote/sync.d.ts +182 -0
- package/dist/remote/sync.js +523 -0
- package/dist/remote/sync.js.map +1 -0
- package/dist/remote/transport/budget.d.ts +48 -0
- package/dist/remote/transport/budget.js +68 -0
- package/dist/remote/transport/budget.js.map +1 -0
- package/dist/remote/transport/connector.d.ts +115 -0
- package/dist/remote/transport/connector.js +21 -0
- package/dist/remote/transport/connector.js.map +1 -0
- package/dist/remote/transport/error.d.ts +88 -0
- package/dist/remote/transport/error.js +196 -0
- package/dist/remote/transport/error.js.map +1 -0
- package/dist/remote/transport/gh.d.ts +20 -0
- package/dist/remote/transport/gh.js +41 -0
- package/dist/remote/transport/gh.js.map +1 -0
- package/dist/remote/transport/graphql.d.ts +25 -0
- package/dist/remote/transport/graphql.js +81 -0
- package/dist/remote/transport/graphql.js.map +1 -0
- package/dist/remote/transport/http.d.ts +47 -0
- package/dist/remote/transport/http.js +195 -0
- package/dist/remote/transport/http.js.map +1 -0
- package/dist/remote/transport/index.d.ts +18 -0
- package/dist/remote/transport/index.js +19 -0
- package/dist/remote/transport/index.js.map +1 -0
- package/dist/remote/transport/process.d.ts +39 -0
- package/dist/remote/transport/process.js +121 -0
- package/dist/remote/transport/process.js.map +1 -0
- package/dist/remote/transport/rest.d.ts +22 -0
- package/dist/remote/transport/rest.js +57 -0
- package/dist/remote/transport/rest.js.map +1 -0
- package/dist/remote/transport/retry.d.ts +91 -0
- package/dist/remote/transport/retry.js +138 -0
- package/dist/remote/transport/retry.js.map +1 -0
- package/dist/remote/transport-error.d.ts +19 -0
- package/dist/remote/transport-error.js +22 -0
- package/dist/remote/transport-error.js.map +1 -0
- package/dist/remote/vocabulary.d.ts +126 -0
- package/dist/remote/vocabulary.js +57 -0
- package/dist/remote/vocabulary.js.map +1 -0
- package/dist/runner/config.d.ts +7 -0
- package/dist/runner/config.js +61 -0
- package/dist/runner/config.js.map +1 -0
- package/dist/runner/git.d.ts +19 -0
- package/dist/runner/git.js +26 -0
- package/dist/runner/git.js.map +1 -0
- package/dist/runner/index.d.ts +20 -0
- package/dist/runner/index.js +21 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/loop.d.ts +46 -0
- package/dist/runner/loop.js +243 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/pi.d.ts +39 -0
- package/dist/runner/pi.js +276 -0
- package/dist/runner/pi.js.map +1 -0
- package/dist/runner/shell.d.ts +44 -0
- package/dist/runner/shell.js +174 -0
- package/dist/runner/shell.js.map +1 -0
- package/dist/runner/stats.d.ts +19 -0
- package/dist/runner/stats.js +58 -0
- package/dist/runner/stats.js.map +1 -0
- package/dist/runner/types.d.ts +218 -0
- package/dist/runner/types.js +37 -0
- package/dist/runner/types.js.map +1 -0
- package/dist/server/git.d.ts +8 -0
- package/dist/server/git.js +50 -0
- package/dist/server/git.js.map +1 -0
- package/dist/server/http/respond.d.ts +13 -0
- package/dist/server/http/respond.js +59 -0
- package/dist/server/http/respond.js.map +1 -0
- package/dist/server/http/router.d.ts +27 -0
- package/dist/server/http/router.js +48 -0
- package/dist/server/http/router.js.map +1 -0
- package/dist/server/http/static.d.ts +14 -0
- package/dist/server/http/static.js +55 -0
- package/dist/server/http/static.js.map +1 -0
- package/dist/server/index.d.ts +58 -0
- package/dist/server/index.js +124 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/board.d.ts +8 -0
- package/dist/server/routes/board.js +19 -0
- package/dist/server/routes/board.js.map +1 -0
- package/dist/server/routes/comments.d.ts +13 -0
- package/dist/server/routes/comments.js +36 -0
- package/dist/server/routes/comments.js.map +1 -0
- package/dist/server/routes/flags.d.ts +16 -0
- package/dist/server/routes/flags.js +37 -0
- package/dist/server/routes/flags.js.map +1 -0
- package/dist/server/routes/git.d.ts +13 -0
- package/dist/server/routes/git.js +84 -0
- package/dist/server/routes/git.js.map +1 -0
- package/dist/server/routes/remotes.d.ts +36 -0
- package/dist/server/routes/remotes.js +749 -0
- package/dist/server/routes/remotes.js.map +1 -0
- package/dist/server/routes/views.d.ts +10 -0
- package/dist/server/routes/views.js +63 -0
- package/dist/server/routes/views.js.map +1 -0
- package/dist/server/views/schema.d.ts +2 -0
- package/dist/server/views/schema.js +121 -0
- package/dist/server/views/schema.js.map +1 -0
- package/dist/server/views/store.d.ts +17 -0
- package/dist/server/views/store.js +67 -0
- package/dist/server/views/store.js.map +1 -0
- package/dist/shared/adf.d.ts +83 -0
- package/dist/shared/adf.js +795 -0
- package/dist/shared/adf.js.map +1 -0
- package/dist/shared/blocking.d.ts +130 -0
- package/dist/shared/blocking.js +179 -0
- package/dist/shared/blocking.js.map +1 -0
- package/dist/shared/changes.d.ts +100 -0
- package/dist/shared/changes.js +112 -0
- package/dist/shared/changes.js.map +1 -0
- package/dist/shared/cohesion.d.ts +75 -0
- package/dist/shared/cohesion.js +132 -0
- package/dist/shared/cohesion.js.map +1 -0
- package/dist/shared/dependency-rollup.d.ts +91 -0
- package/dist/shared/dependency-rollup.js +132 -0
- package/dist/shared/dependency-rollup.js.map +1 -0
- package/dist/shared/errors.d.ts +23 -0
- package/dist/shared/errors.js +24 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/flag-rollup.d.ts +88 -0
- package/dist/shared/flag-rollup.js +119 -0
- package/dist/shared/flag-rollup.js.map +1 -0
- package/dist/shared/git-sync.d.ts +90 -0
- package/dist/shared/git-sync.js +9 -0
- package/dist/shared/git-sync.js.map +1 -0
- package/dist/shared/index.d.ts +40 -0
- package/dist/shared/index.js +41 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/model.d.ts +218 -0
- package/dist/shared/model.js +95 -0
- package/dist/shared/model.js.map +1 -0
- package/dist/shared/period-query.d.ts +21 -0
- package/dist/shared/period-query.js +26 -0
- package/dist/shared/period-query.js.map +1 -0
- package/dist/shared/period-stance.d.ts +45 -0
- package/dist/shared/period-stance.js +50 -0
- package/dist/shared/period-stance.js.map +1 -0
- package/dist/shared/plans/breakdown.d.ts +66 -0
- package/dist/shared/plans/breakdown.js +186 -0
- package/dist/shared/plans/breakdown.js.map +1 -0
- package/dist/shared/plans/index.d.ts +21 -0
- package/dist/shared/plans/index.js +22 -0
- package/dist/shared/plans/index.js.map +1 -0
- package/dist/shared/plans/instantiate.d.ts +61 -0
- package/dist/shared/plans/instantiate.js +184 -0
- package/dist/shared/plans/instantiate.js.map +1 -0
- package/dist/shared/plans/reading.d.ts +79 -0
- package/dist/shared/plans/reading.js +149 -0
- package/dist/shared/plans/reading.js.map +1 -0
- package/dist/shared/plans/reparent.d.ts +54 -0
- package/dist/shared/plans/reparent.js +217 -0
- package/dist/shared/plans/reparent.js.map +1 -0
- package/dist/shared/plans/timeline.d.ts +93 -0
- package/dist/shared/plans/timeline.js +224 -0
- package/dist/shared/plans/timeline.js.map +1 -0
- package/dist/shared/plans/upstream.d.ts +67 -0
- package/dist/shared/plans/upstream.js +73 -0
- package/dist/shared/plans/upstream.js.map +1 -0
- package/dist/shared/remote-api.d.ts +413 -0
- package/dist/shared/remote-api.js +11 -0
- package/dist/shared/remote-api.js.map +1 -0
- package/dist/shared/remote-coverage.d.ts +120 -0
- package/dist/shared/remote-coverage.js +98 -0
- package/dist/shared/remote-coverage.js.map +1 -0
- package/dist/shared/remote-readiness.d.ts +162 -0
- package/dist/shared/remote-readiness.js +49 -0
- package/dist/shared/remote-readiness.js.map +1 -0
- package/dist/shared/remote-status.d.ts +268 -0
- package/dist/shared/remote-status.js +79 -0
- package/dist/shared/remote-status.js.map +1 -0
- package/dist/shared/rollup.d.ts +90 -0
- package/dist/shared/rollup.js +119 -0
- package/dist/shared/rollup.js.map +1 -0
- package/dist/shared/static.d.ts +65 -0
- package/dist/shared/static.js +107 -0
- package/dist/shared/static.js.map +1 -0
- package/dist/shared/template-params.d.ts +80 -0
- package/dist/shared/template-params.js +141 -0
- package/dist/shared/template-params.js.map +1 -0
- package/dist/shared/view.d.ts +105 -0
- package/dist/shared/view.js +44 -0
- package/dist/shared/view.js.map +1 -0
- package/dist/shared/work-unit.d.ts +34 -0
- package/dist/shared/work-unit.js +47 -0
- package/dist/shared/work-unit.js.map +1 -0
- package/dist/sync/apply.d.ts +21 -0
- package/dist/sync/apply.js +149 -0
- package/dist/sync/apply.js.map +1 -0
- package/dist/sync/dto.d.ts +9 -0
- package/dist/sync/dto.js +162 -0
- package/dist/sync/dto.js.map +1 -0
- package/dist/sync/index.d.ts +24 -0
- package/dist/sync/index.js +25 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/patch.d.ts +13 -0
- package/dist/sync/patch.js +212 -0
- package/dist/sync/patch.js.map +1 -0
- package/dist/sync/session.d.ts +31 -0
- package/dist/sync/session.js +55 -0
- package/dist/sync/session.js.map +1 -0
- package/dist/sync/static.d.ts +11 -0
- package/dist/sync/static.js +33 -0
- package/dist/sync/static.js.map +1 -0
- package/package.json +95 -4
- package/templates/blank.yml +71 -0
- package/templates/context/bug.md +107 -0
- package/templates/context/default.md +119 -0
- package/templates/context/epic.md +81 -0
- package/templates/context/feature.md +91 -0
- package/templates/context/research.md +87 -0
- package/templates/context/review.md +81 -0
- package/templates/context/story.md +94 -0
- package/templates/context/sub_task.md +108 -0
- package/templates/context/task.md +86 -0
- package/templates/context/test.md +73 -0
- package/templates/context/user_story.md +147 -0
- package/templates/kanban.yml +226 -0
- package/templates/scrum.yml +567 -0
- package/web/dist/assets/index-D0j8OnHq.js +35 -0
- package/web/dist/assets/index-DFL7v8aP.css +1 -0
- package/web/dist/index.html +13 -0
- package/web/dist-viewer/assets/index-Bcns6OuC.css +1 -0
- package/web/dist-viewer/assets/index-vVXzeiFo.js +7 -0
- package/web/dist-viewer/index.html +14 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connecting a remote and storing its credential, for a caller with no
|
|
3
|
+
* terminal to ask at — the web UI.
|
|
4
|
+
*
|
|
5
|
+
* `lpm remote connect` and `lpm remote login` gather their answers one question
|
|
6
|
+
* at a time; a form sends them all at once. What both must refuse is the same,
|
|
7
|
+
* and it lives here once:
|
|
8
|
+
*
|
|
9
|
+
* - **A secret never lands in config.yml.** A credential key sent as a
|
|
10
|
+
* connection value is refused before anything is written — `addRemote`
|
|
11
|
+
* would otherwise draft it into a file that is committed.
|
|
12
|
+
* - **Only a declared credential key is stored**, exactly as `login` refuses
|
|
13
|
+
* a `--key` the provider does not have.
|
|
14
|
+
* - **A blank keeps what is there** — the form's equivalent of a bare Enter at
|
|
15
|
+
* the `login` prompt, so re-saving to replace one expired token does not
|
|
16
|
+
* demand the other half of the credential back.
|
|
17
|
+
* - **A remote that already mirrors documents is not re-pointed in place.**
|
|
18
|
+
* Changing its repo, site or project would leave every twin in its link
|
|
19
|
+
* store naming an issue in the old place. Pointing a board somewhere else
|
|
20
|
+
* is a remove and a new connect, deliberately, so it is refused here rather
|
|
21
|
+
* than reconciled.
|
|
22
|
+
*
|
|
23
|
+
* Nothing here returns a secret value. A credential's *state* comes from
|
|
24
|
+
* `credentialStates`, which says where a value comes from and never what it is.
|
|
25
|
+
*/
|
|
26
|
+
import { remoteNamed, remoteNames } from '../core/config/lookup.js';
|
|
27
|
+
import { BoardError } from '../core/errors.js';
|
|
28
|
+
import { ensureLocalIgnored } from '../core/storage/local.js';
|
|
29
|
+
import { addRemote, connectionFlags, secretKeyNames, updateRemoteConnection, } from './config-file.js';
|
|
30
|
+
import { credentialStates, writeCredential } from './credentials.js';
|
|
31
|
+
import { loadLinkStore } from './links.js';
|
|
32
|
+
import { lookupProvider } from './registry.js';
|
|
33
|
+
/** A declared remote, or a `BoardError` naming the ones that are. */
|
|
34
|
+
function requireDeclared(config, name) {
|
|
35
|
+
const declared = remoteNamed(config, name);
|
|
36
|
+
if (!declared) {
|
|
37
|
+
const names = remoteNames(config);
|
|
38
|
+
throw new BoardError(`No remote named "${name}"`, [
|
|
39
|
+
names.length > 0 ? `Declared remotes: ${names.join(', ')}` : 'This board declares no remotes',
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
return declared;
|
|
43
|
+
}
|
|
44
|
+
/** Refuse a key that is a credential, sent where a connection value belongs. */
|
|
45
|
+
function refuseSecret(providerName, key) {
|
|
46
|
+
throw new BoardError(`"${key}" is a credential of provider "${providerName}", not a connection value`, [
|
|
47
|
+
'Credentials are stored in .lpm/credentials.json, which is git-ignored — never in config.yml, which is committed.',
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
/** Refuse a key the provider does not declare at all. */
|
|
51
|
+
function refuseUnknown(providerName, key, provider) {
|
|
52
|
+
const known = connectionFlags(provider).map((flag) => flag.name);
|
|
53
|
+
throw new BoardError(`"${key}" is not a connection option for provider "${providerName}"`, [
|
|
54
|
+
`Its connection options are: ${known.join(', ') || 'none'}`,
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Refuse a credential key the provider does not declare — `login --key`'s rule,
|
|
59
|
+
* for a caller that sends several keys at once.
|
|
60
|
+
*/
|
|
61
|
+
export function assertCredentialKeys(remote, providerName, keys) {
|
|
62
|
+
if (keys.length === 0)
|
|
63
|
+
return;
|
|
64
|
+
const declared = secretKeyNames(lookupProvider(providerName));
|
|
65
|
+
if (declared.length === 0) {
|
|
66
|
+
throw new BoardError(`Remote "${remote}" (${providerName}) needs no credential`, [
|
|
67
|
+
'This provider holds no secrets, so there is nothing to store.',
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
for (const key of keys) {
|
|
71
|
+
if (!declared.includes(key)) {
|
|
72
|
+
throw new BoardError(`"${key}" is not a credential of provider "${providerName}"`, [
|
|
73
|
+
`Its credential keys are: ${declared.join(', ')}`,
|
|
74
|
+
]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Store the credential values given, in `.lpm/credentials.json`.
|
|
80
|
+
*
|
|
81
|
+
* Every key is checked before any is written, so a refused key never leaves the
|
|
82
|
+
* file half-updated. A blank value is skipped — it keeps what is already there.
|
|
83
|
+
* Returns the keys actually written, never their values.
|
|
84
|
+
*/
|
|
85
|
+
export function storeCredentials(paths, remote, providerName, values) {
|
|
86
|
+
assertCredentialKeys(remote, providerName, Object.keys(values));
|
|
87
|
+
const written = [];
|
|
88
|
+
for (const [key, raw] of Object.entries(values)) {
|
|
89
|
+
const value = typeof raw === 'string' ? raw.trim() : '';
|
|
90
|
+
if (value === '')
|
|
91
|
+
continue;
|
|
92
|
+
writeCredential(paths, remote, key, value);
|
|
93
|
+
written.push(key);
|
|
94
|
+
}
|
|
95
|
+
if (written.length > 0)
|
|
96
|
+
ensureLocalIgnored(paths);
|
|
97
|
+
return written;
|
|
98
|
+
}
|
|
99
|
+
/** One declared remote's credential states — where each value comes from, never the value. */
|
|
100
|
+
export function remoteCredentialStates(paths, config, name) {
|
|
101
|
+
const declared = requireDeclared(config, name);
|
|
102
|
+
const provider = lookupProvider(declared.provider);
|
|
103
|
+
return credentialStates(name, declared.connection, provider.credentials?.secrets ?? {}, paths);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The connection values a form sent, checked against the provider: a secret is
|
|
107
|
+
* refused (it would be written into a committed file), an undeclared key is
|
|
108
|
+
* refused (a typo would otherwise be a silently missing value), and a blank is
|
|
109
|
+
* dropped so the provider's default — or the schema's own "required" message —
|
|
110
|
+
* applies. A boolean is written only when set, as `lpm remote add` does.
|
|
111
|
+
*/
|
|
112
|
+
function cleanConnection(providerName, provider, given) {
|
|
113
|
+
const secrets = new Set(secretKeyNames(provider));
|
|
114
|
+
const known = new Set(connectionFlags(provider).map((flag) => flag.name));
|
|
115
|
+
const out = {};
|
|
116
|
+
for (const [key, value] of Object.entries(given)) {
|
|
117
|
+
if (secrets.has(key))
|
|
118
|
+
refuseSecret(providerName, key);
|
|
119
|
+
if (!known.has(key))
|
|
120
|
+
refuseUnknown(providerName, key, provider);
|
|
121
|
+
if (typeof value === 'boolean') {
|
|
122
|
+
if (value)
|
|
123
|
+
out[key] = true;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const trimmed = String(value).trim();
|
|
127
|
+
if (trimmed !== '')
|
|
128
|
+
out[key] = trimmed;
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Declare a remote and store its credential in one call — `lpm remote connect`
|
|
134
|
+
* with every question answered up front.
|
|
135
|
+
*
|
|
136
|
+
* Everything that can be refused is refused before anything is written: the
|
|
137
|
+
* name, the connection keys and the credential keys. `addRemote` then validates
|
|
138
|
+
* the connection against the provider's schema and drafts the mapping, exactly
|
|
139
|
+
* as it does for the CLI.
|
|
140
|
+
*/
|
|
141
|
+
export function connectRemote(paths, config, options) {
|
|
142
|
+
const provider = lookupProvider(options.provider);
|
|
143
|
+
if (remoteNames(config).includes(options.name) && options.force !== true) {
|
|
144
|
+
throw new BoardError(`This board already has a remote named "${options.name}"`, [
|
|
145
|
+
'Choose another name, or replace it deliberately — its mapping is drafted again, and its link store is kept.',
|
|
146
|
+
]);
|
|
147
|
+
}
|
|
148
|
+
const connection = cleanConnection(options.provider, provider, options.connection);
|
|
149
|
+
const credentials = options.credentials ?? {};
|
|
150
|
+
assertCredentialKeys(options.name, options.provider, Object.keys(credentials));
|
|
151
|
+
const result = addRemote(paths, {
|
|
152
|
+
name: options.name,
|
|
153
|
+
provider: options.provider,
|
|
154
|
+
connection,
|
|
155
|
+
...(options.scope !== undefined && options.scope.trim() !== '' ? { scope: options.scope.trim() } : {}),
|
|
156
|
+
force: options.force === true,
|
|
157
|
+
});
|
|
158
|
+
const stored = storeCredentials(paths, result.name, options.provider, credentials);
|
|
159
|
+
return {
|
|
160
|
+
...result,
|
|
161
|
+
stored,
|
|
162
|
+
credentials: credentialStates(result.name, result.connection, provider.credentials?.secrets ?? {}, paths),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Change connection values on a declared remote.
|
|
167
|
+
*
|
|
168
|
+
* A gap is always filled, and an optional value may be removed by sending a
|
|
169
|
+
* blank. Changing a value that is already set is **re-pointing** the remote,
|
|
170
|
+
* and a remote that already mirrors documents cannot be re-pointed in place —
|
|
171
|
+
* with one exception decided by the provider, not by this file: a key the
|
|
172
|
+
* provider declares as *conditional* (Jira's Agile board, which says where
|
|
173
|
+
* sprints live and never where issues are) may be corrected at any time, and so
|
|
174
|
+
* may a boolean switch. A switch is only ever set to `true` or removed.
|
|
175
|
+
*/
|
|
176
|
+
export function setRemoteConnection(paths, config, name, values) {
|
|
177
|
+
const declared = requireDeclared(config, name);
|
|
178
|
+
const provider = lookupProvider(declared.provider);
|
|
179
|
+
const secrets = new Set(secretKeyNames(provider));
|
|
180
|
+
const flags = new Map(connectionFlags(provider).map((flag) => [flag.name, flag]));
|
|
181
|
+
const conditional = new Set((provider.conditionalConnection ?? []).map((need) => need.key));
|
|
182
|
+
const current = declared.connection;
|
|
183
|
+
const changes = {};
|
|
184
|
+
const repointed = [];
|
|
185
|
+
for (const [key, raw] of Object.entries(values)) {
|
|
186
|
+
if (secrets.has(key))
|
|
187
|
+
refuseSecret(declared.provider, key);
|
|
188
|
+
const flag = flags.get(key);
|
|
189
|
+
if (flag === undefined)
|
|
190
|
+
refuseUnknown(declared.provider, key, provider);
|
|
191
|
+
// A switch is set or removed, never written `false`. Absent is every
|
|
192
|
+
// switch's schema default, and for Jira's `tls_verify` an explicit `false`
|
|
193
|
+
// is what turns certificate checking *off* — a "loud, never-default
|
|
194
|
+
// fallback" that must be typed into config.yml on purpose, not reached by
|
|
195
|
+
// unticking a box. Removing the key restores the default instead.
|
|
196
|
+
const value = raw === false ? '' : typeof raw === 'boolean' ? raw : String(raw).trim();
|
|
197
|
+
const before = current[key];
|
|
198
|
+
const had = before !== undefined && before !== null && String(before) !== '';
|
|
199
|
+
if (value === '' && flag.required) {
|
|
200
|
+
throw new BoardError(`${key} is required for provider "${declared.provider}"`, [
|
|
201
|
+
'The remote cannot be reached without it, so it can be changed but not removed.',
|
|
202
|
+
]);
|
|
203
|
+
}
|
|
204
|
+
if (had && String(before) === String(value))
|
|
205
|
+
continue;
|
|
206
|
+
// An explicit `false` written by hand is a decision somebody made in the
|
|
207
|
+
// file; a form's untick does not overrule it.
|
|
208
|
+
if (raw === false && String(before) === 'false')
|
|
209
|
+
continue;
|
|
210
|
+
if (!had && value === '')
|
|
211
|
+
continue;
|
|
212
|
+
if (had && typeof value === 'string' && !conditional.has(key))
|
|
213
|
+
repointed.push(key);
|
|
214
|
+
changes[key] = value;
|
|
215
|
+
}
|
|
216
|
+
if (Object.keys(changes).length === 0)
|
|
217
|
+
return { changed: [] };
|
|
218
|
+
if (repointed.length > 0) {
|
|
219
|
+
const linked = loadLinkStore(paths, name).links.size;
|
|
220
|
+
if (linked > 0) {
|
|
221
|
+
throw new BoardError(`Remote "${name}" already mirrors ${linked} document${linked === 1 ? '' : 's'}, so ${repointed.join(', ')} cannot change in place`, [
|
|
222
|
+
'Every twin in its link store names an issue where the remote points now — pointing it elsewhere would leave them naming issues that are not there.',
|
|
223
|
+
'To point this board at a different project, remove the remote and connect it again.',
|
|
224
|
+
]);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return updateRemoteConnection(paths, name, changes, { overwrite: true });
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/remote/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAwB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,qEAAqE;AACrE,SAAS,eAAe,CAAC,MAAmB,EAAE,IAAY;IACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,UAAU,CAAC,oBAAoB,IAAI,GAAG,EAAE;YAChD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,gCAAgC;SAC9F,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,YAAoB,EAAE,GAAW;IACrD,MAAM,IAAI,UAAU,CAAC,IAAI,GAAG,kCAAkC,YAAY,2BAA2B,EAAE;QACrG,kHAAkH;KACnH,CAAC,CAAC;AACL,CAAC;AAED,yDAAyD;AACzD,SAAS,aAAa,CAAC,YAAoB,EAAE,GAAW,EAAE,QAAkB;IAC1E,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,IAAI,UAAU,CAAC,IAAI,GAAG,8CAA8C,YAAY,GAAG,EAAE;QACzF,+BAA+B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;KAC5D,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,YAAoB,EAAE,IAAuB;IAChG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,WAAW,MAAM,MAAM,YAAY,uBAAuB,EAAE;YAC/E,+DAA+D;SAChE,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,UAAU,CAAC,IAAI,GAAG,sCAAsC,YAAY,GAAG,EAAE;gBACjF,4BAA4B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAiB,EACjB,MAAc,EACd,YAAoB,EACpB,MAAwC;IAExC,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAC3B,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,sBAAsB,CAAC,KAAiB,EAAE,MAAmB,EAAE,IAAY;IACzF,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAO,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;AACjG,CAAC;AAsBD;;;;;;GAMG;AACH,SAAS,eAAe,CACtB,YAAoB,EACpB,QAAkB,EAClB,KAAiD;IAEjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChE,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,KAAK;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,OAAO,KAAK,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAiB,EACjB,MAAmB,EACnB,OAA6B;IAE7B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACzE,MAAM,IAAI,UAAU,CAAC,0CAA0C,OAAO,CAAC,IAAI,GAAG,EAAE;YAC9E,6GAA6G;SAC9G,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU;QACV,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEnF,OAAO;QACL,GAAG,MAAM;QACT,MAAM;QACN,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC;KAC1G,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,MAAmB,EACnB,IAAY,EACZ,MAAkD;IAElD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAqC,CAAC;IAE/D,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI,KAAK,SAAS;YAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAExE,qEAAqE;QACrE,2EAA2E;QAC3E,oEAAoE;QACpE,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACvF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAE7E,IAAI,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,UAAU,CAAC,GAAG,GAAG,8BAA8B,QAAQ,CAAC,QAAQ,GAAG,EAAE;gBAC7E,gFAAgF;aACjF,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;YAAE,SAAS;QACtD,yEAAyE;QACzE,8CAA8C;QAC9C,IAAI,GAAG,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,OAAO;YAAE,SAAS;QAC1D,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QACnC,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE9D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAClB,WAAW,IAAI,qBAAqB,MAAM,YAAY,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,SAAS,CAAC,IAAI,CACjG,IAAI,CACL,yBAAyB,EAC1B;gBACE,oJAAoJ;gBACpJ,qFAAqF;aACtF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage: which documents the mirror is missing, and what each one costs.
|
|
3
|
+
*
|
|
4
|
+
* The offline twin of `report.ts`. `computeRemoteStatus` asks the tracker
|
|
5
|
+
* about every twin it holds; this asks nothing of anybody — the board and the
|
|
6
|
+
* link store already say which documents are mirrored, and the board says how
|
|
7
|
+
* they relate to the ones that are not. So it is fast on a large board, it
|
|
8
|
+
* works without a credential, and it can be re-read after every push without
|
|
9
|
+
* costing a request.
|
|
10
|
+
*
|
|
11
|
+
* `planCoverage` is pure (a `BoardView` and two id sets in, a report out), and
|
|
12
|
+
* `computeRemoteCoverage` is the adapter that opens a declared remote and
|
|
13
|
+
* feeds it. The classification rules are all in one place because they are
|
|
14
|
+
* easy to get subtly wrong:
|
|
15
|
+
*
|
|
16
|
+
* - **A gap is only a gap when something mirrored points at it.** Every
|
|
17
|
+
* unpushed document is already reported by the status report's `unlinked`
|
|
18
|
+
* bucket, and on a board that mirrors one feature that bucket is the whole
|
|
19
|
+
* backlog. What is worth a person's attention is the document the mirror
|
|
20
|
+
* itself implies: the container of a filed issue, the sprint it was filed
|
|
21
|
+
* without, the blocker its dependency edge was dropped for.
|
|
22
|
+
* - **A tombstone and an out-of-scope document are not gaps.** Both were
|
|
23
|
+
* decided, and offering them for pushing would undo the decision. They are
|
|
24
|
+
* reported separately so a short list is explainable, which is the same
|
|
25
|
+
* rule `describeScope` follows everywhere else.
|
|
26
|
+
* - **A period is only a gap where periods are filed at all.** A remote
|
|
27
|
+
* whose mapping carries no `periods` block rides the schedule in the
|
|
28
|
+
* managed block, so there is no twin for a sprint to be missing.
|
|
29
|
+
*/
|
|
30
|
+
import type { LoadedBoard } from '../core/board/load.js';
|
|
31
|
+
import type { BoardView } from '../shared/plans/reading.js';
|
|
32
|
+
import { type RemoteCoverageReport } from '../shared/remote-coverage.js';
|
|
33
|
+
/** What `planCoverage` needs: the board, who is mirrored, and what is filed. */
|
|
34
|
+
export interface CoverageInputs {
|
|
35
|
+
board: BoardView;
|
|
36
|
+
/** Local ids the remote holds a twin of. */
|
|
37
|
+
mirrored: ReadonlySet<string>;
|
|
38
|
+
/** Local ids carrying a tombstone — decoupled on purpose. */
|
|
39
|
+
tombstoned: ReadonlySet<string>;
|
|
40
|
+
/** The remote's scope root; absent means the whole board. */
|
|
41
|
+
scope?: string;
|
|
42
|
+
/**
|
|
43
|
+
* The period *type* this remote files as a container (`sprint`), or absent
|
|
44
|
+
* when it files no periods. Only periods of that type can be gaps: a level
|
|
45
|
+
* above it degrades into the managed block and has no twin either way.
|
|
46
|
+
*/
|
|
47
|
+
periodContainer?: string;
|
|
48
|
+
remote: RemoteCoverageReport['remote'];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Classify the board against one remote's mirror.
|
|
52
|
+
*
|
|
53
|
+
* Pure: no disk, no network, no clock. Every rule it applies is in this
|
|
54
|
+
* function, so "why is this in the list?" has one place to look.
|
|
55
|
+
*/
|
|
56
|
+
export declare function planCoverage(inputs: CoverageInputs): RemoteCoverageReport;
|
|
57
|
+
/**
|
|
58
|
+
* Compute the coverage report for one declared remote.
|
|
59
|
+
*
|
|
60
|
+
* Offline by construction: it opens the remote to read its mapping and scope,
|
|
61
|
+
* reads the link store, and asks the tracker nothing. A remote with no
|
|
62
|
+
* credential reports exactly as well as one with a valid token — which is the
|
|
63
|
+
* property that lets the web app re-read coverage after every push.
|
|
64
|
+
*/
|
|
65
|
+
export declare function computeRemoteCoverage(board: LoadedBoard, name: string): RemoteCoverageReport;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage: which documents the mirror is missing, and what each one costs.
|
|
3
|
+
*
|
|
4
|
+
* The offline twin of `report.ts`. `computeRemoteStatus` asks the tracker
|
|
5
|
+
* about every twin it holds; this asks nothing of anybody — the board and the
|
|
6
|
+
* link store already say which documents are mirrored, and the board says how
|
|
7
|
+
* they relate to the ones that are not. So it is fast on a large board, it
|
|
8
|
+
* works without a credential, and it can be re-read after every push without
|
|
9
|
+
* costing a request.
|
|
10
|
+
*
|
|
11
|
+
* `planCoverage` is pure (a `BoardView` and two id sets in, a report out), and
|
|
12
|
+
* `computeRemoteCoverage` is the adapter that opens a declared remote and
|
|
13
|
+
* feeds it. The classification rules are all in one place because they are
|
|
14
|
+
* easy to get subtly wrong:
|
|
15
|
+
*
|
|
16
|
+
* - **A gap is only a gap when something mirrored points at it.** Every
|
|
17
|
+
* unpushed document is already reported by the status report's `unlinked`
|
|
18
|
+
* bucket, and on a board that mirrors one feature that bucket is the whole
|
|
19
|
+
* backlog. What is worth a person's attention is the document the mirror
|
|
20
|
+
* itself implies: the container of a filed issue, the sprint it was filed
|
|
21
|
+
* without, the blocker its dependency edge was dropped for.
|
|
22
|
+
* - **A tombstone and an out-of-scope document are not gaps.** Both were
|
|
23
|
+
* decided, and offering them for pushing would undo the decision. They are
|
|
24
|
+
* reported separately so a short list is explainable, which is the same
|
|
25
|
+
* rule `describeScope` follows everywhere else.
|
|
26
|
+
* - **A period is only a gap where periods are filed at all.** A remote
|
|
27
|
+
* whose mapping carries no `periods` block rides the schedule in the
|
|
28
|
+
* managed block, so there is no twin for a sprint to be missing.
|
|
29
|
+
*/
|
|
30
|
+
import { remoteNamed } from '../core/config/lookup.js';
|
|
31
|
+
import { subtreeIds } from '../shared/plans/reading.js';
|
|
32
|
+
import { COVERAGE_ANCHOR_LIMIT, COVERAGE_RELATIONS, } from '../shared/remote-coverage.js';
|
|
33
|
+
import { toSnapshot } from '../sync/dto.js';
|
|
34
|
+
import { describeTarget } from './config-file.js';
|
|
35
|
+
import { loadLinkStore } from './links.js';
|
|
36
|
+
import { normalizePeriodMapping } from './periods.js';
|
|
37
|
+
import { openRemote } from './remotes.js';
|
|
38
|
+
/** Ids read the way a person reads them: `LP-9` before `LP-10`. */
|
|
39
|
+
function byId(a, b) {
|
|
40
|
+
return a.localeCompare(b, 'en', { numeric: true });
|
|
41
|
+
}
|
|
42
|
+
function isIssue(node) {
|
|
43
|
+
return node?.kind === 'issue';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Classify the board against one remote's mirror.
|
|
47
|
+
*
|
|
48
|
+
* Pure: no disk, no network, no clock. Every rule it applies is in this
|
|
49
|
+
* function, so "why is this in the list?" has one place to look.
|
|
50
|
+
*/
|
|
51
|
+
export function planCoverage(inputs) {
|
|
52
|
+
const { board, mirrored, tombstoned, periodContainer } = inputs;
|
|
53
|
+
const scopeSet = inputs.scope !== undefined ? new Set(subtreeIds(board, inputs.scope)) : null;
|
|
54
|
+
const inScope = (id) => scopeSet === null || scopeSet.has(id);
|
|
55
|
+
const nodes = Object.values(board.nodes);
|
|
56
|
+
const issues = nodes.filter(isIssue);
|
|
57
|
+
/** Periods that could be filed at all — the container level, and no other. */
|
|
58
|
+
const filedPeriods = periodContainer === undefined
|
|
59
|
+
? []
|
|
60
|
+
: nodes.filter((node) => node.kind === 'period' && node.type === periodContainer);
|
|
61
|
+
/** Mirrored documents that still exist on the board — the anchors. */
|
|
62
|
+
const anchors = new Set([...mirrored].filter((id) => {
|
|
63
|
+
const node = board.nodes[id];
|
|
64
|
+
return node !== undefined && (node.kind === 'issue' || node.kind === 'period');
|
|
65
|
+
}));
|
|
66
|
+
const drafts = new Map();
|
|
67
|
+
const note = (id, relation, anchor) => {
|
|
68
|
+
const node = board.nodes[id];
|
|
69
|
+
if (node === undefined)
|
|
70
|
+
return;
|
|
71
|
+
if (anchors.has(id))
|
|
72
|
+
return; // it is mirrored: not a gap
|
|
73
|
+
let draft = drafts.get(id);
|
|
74
|
+
if (draft === undefined) {
|
|
75
|
+
draft = { node, anchors: new Map() };
|
|
76
|
+
drafts.set(id, draft);
|
|
77
|
+
}
|
|
78
|
+
const list = draft.anchors.get(relation);
|
|
79
|
+
if (list === undefined)
|
|
80
|
+
draft.anchors.set(relation, [anchor]);
|
|
81
|
+
else if (!list.includes(anchor))
|
|
82
|
+
list.push(anchor);
|
|
83
|
+
};
|
|
84
|
+
// -- parent: the containers of mirrored work ------------------------------
|
|
85
|
+
// Walked up from each anchor and stopped at the first mirrored ancestor:
|
|
86
|
+
// above that one, the break in the chain is that ancestor's to explain, not
|
|
87
|
+
// this one's.
|
|
88
|
+
for (const id of anchors) {
|
|
89
|
+
const seen = new Set([id]);
|
|
90
|
+
let current = board.nodes[id]?.parentId ?? null;
|
|
91
|
+
while (current !== null && !seen.has(current)) {
|
|
92
|
+
seen.add(current);
|
|
93
|
+
if (anchors.has(current))
|
|
94
|
+
break;
|
|
95
|
+
// The walk stops at the scope boundary rather than reporting what it
|
|
96
|
+
// finds above it. A scoped remote's root has a parent by definition, and
|
|
97
|
+
// nobody ever meant to file it — listing it every time is how a report
|
|
98
|
+
// that should be short teaches people to stop reading it. An
|
|
99
|
+
// out-of-scope *dependency* is a different matter and is still reported:
|
|
100
|
+
// there the edge was genuinely dropped.
|
|
101
|
+
if (!inScope(current))
|
|
102
|
+
break;
|
|
103
|
+
note(current, 'parent', id);
|
|
104
|
+
current = board.nodes[current]?.parentId ?? null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// -- child: unmirrored work inside a mirrored container -------------------
|
|
108
|
+
// Anchored at the *nearest* mirrored ancestor, so a story two levels under a
|
|
109
|
+
// mirrored epic is reported against the epic that is actually filed.
|
|
110
|
+
for (const issue of issues) {
|
|
111
|
+
if (anchors.has(issue.id))
|
|
112
|
+
continue;
|
|
113
|
+
const seen = new Set([issue.id]);
|
|
114
|
+
let current = issue.parentId;
|
|
115
|
+
while (current !== null && !seen.has(current)) {
|
|
116
|
+
seen.add(current);
|
|
117
|
+
if (anchors.has(current)) {
|
|
118
|
+
note(issue.id, 'child', current);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
current = board.nodes[current]?.parentId ?? null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// -- period: the sprint a mirrored issue was filed without ----------------
|
|
125
|
+
const filedPeriodIds = new Set(filedPeriods.map((period) => period.id));
|
|
126
|
+
for (const id of anchors) {
|
|
127
|
+
const node = board.nodes[id];
|
|
128
|
+
if (!isIssue(node) || node.period === null)
|
|
129
|
+
continue;
|
|
130
|
+
if (!filedPeriodIds.has(node.period))
|
|
131
|
+
continue; // a degraded level: no twin either way
|
|
132
|
+
note(node.period, 'period', id);
|
|
133
|
+
}
|
|
134
|
+
// -- blocker / blocked: an edge needs both ends ---------------------------
|
|
135
|
+
for (const issue of issues) {
|
|
136
|
+
const mine = anchors.has(issue.id);
|
|
137
|
+
for (const dependency of issue.dependsOn) {
|
|
138
|
+
if (!isIssue(board.nodes[dependency]))
|
|
139
|
+
continue;
|
|
140
|
+
const theirs = anchors.has(dependency);
|
|
141
|
+
if (mine && !theirs)
|
|
142
|
+
note(dependency, 'blocker', issue.id);
|
|
143
|
+
else if (!mine && theirs)
|
|
144
|
+
note(issue.id, 'blocked', dependency);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// -- split the drafts three ways ------------------------------------------
|
|
148
|
+
const gaps = [];
|
|
149
|
+
const decoupled = [];
|
|
150
|
+
const outOfScope = [];
|
|
151
|
+
for (const [id, draft] of drafts) {
|
|
152
|
+
if (tombstoned.has(id)) {
|
|
153
|
+
decoupled.push(id);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (!inScope(id)) {
|
|
157
|
+
outOfScope.push(id);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
gaps.push(toGap(id, draft));
|
|
161
|
+
}
|
|
162
|
+
decoupled.sort(byId);
|
|
163
|
+
outOfScope.sort(byId);
|
|
164
|
+
const groups = [];
|
|
165
|
+
for (const { relation } of COVERAGE_RELATIONS) {
|
|
166
|
+
const ids = gaps
|
|
167
|
+
.filter((gap) => gap.reasons.some((reason) => reason.relation === relation))
|
|
168
|
+
.map((gap) => gap.id)
|
|
169
|
+
.sort(byId);
|
|
170
|
+
if (ids.length > 0)
|
|
171
|
+
groups.push({ relation, ids });
|
|
172
|
+
}
|
|
173
|
+
// Worst first: a gap is ranked by its most serious reason, which is the
|
|
174
|
+
// first one `toGap` recorded (the reasons follow the table's order).
|
|
175
|
+
const rank = (gap) => COVERAGE_RELATIONS.findIndex((entry) => entry.relation === gap.reasons[0]?.relation);
|
|
176
|
+
gaps.sort((a, b) => rank(a) - rank(b) || byId(a.id, b.id));
|
|
177
|
+
const total = issues.filter((issue) => inScope(issue.id)).length +
|
|
178
|
+
filedPeriods.filter((period) => inScope(period.id)).length;
|
|
179
|
+
return {
|
|
180
|
+
remote: inputs.remote,
|
|
181
|
+
mirrored: anchors.size,
|
|
182
|
+
total,
|
|
183
|
+
gaps,
|
|
184
|
+
groups,
|
|
185
|
+
decoupled,
|
|
186
|
+
outOfScope,
|
|
187
|
+
filesPeriods: periodContainer !== undefined,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/** One draft as the report carries it: reasons in the table's order, sampled. */
|
|
191
|
+
function toGap(id, draft) {
|
|
192
|
+
const reasons = [];
|
|
193
|
+
for (const { relation } of COVERAGE_RELATIONS) {
|
|
194
|
+
const anchors = draft.anchors.get(relation);
|
|
195
|
+
if (anchors === undefined || anchors.length === 0)
|
|
196
|
+
continue;
|
|
197
|
+
const sorted = [...anchors].sort(byId);
|
|
198
|
+
reasons.push({
|
|
199
|
+
relation,
|
|
200
|
+
anchors: sorted.slice(0, COVERAGE_ANCHOR_LIMIT),
|
|
201
|
+
count: sorted.length,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
id,
|
|
206
|
+
kind: draft.node.kind === 'period' ? 'period' : 'issue',
|
|
207
|
+
type: draft.node.type,
|
|
208
|
+
title: draft.node.title,
|
|
209
|
+
reasons,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/** The board as this layer reads it — the same `BoardView` the planners take. */
|
|
213
|
+
function viewOf(board) {
|
|
214
|
+
const snapshot = toSnapshot(board);
|
|
215
|
+
const nodes = Object.fromEntries([...snapshot.issues, ...snapshot.periods, ...snapshot.resources, ...snapshot.templates].map((node) => [node.id, node]));
|
|
216
|
+
return { config: snapshot.config, nodes };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Compute the coverage report for one declared remote.
|
|
220
|
+
*
|
|
221
|
+
* Offline by construction: it opens the remote to read its mapping and scope,
|
|
222
|
+
* reads the link store, and asks the tracker nothing. A remote with no
|
|
223
|
+
* credential reports exactly as well as one with a valid token — which is the
|
|
224
|
+
* property that lets the web app re-read coverage after every push.
|
|
225
|
+
*/
|
|
226
|
+
export function computeRemoteCoverage(board, name) {
|
|
227
|
+
const remote = openRemote(board.config, name);
|
|
228
|
+
const store = loadLinkStore(board.paths, name);
|
|
229
|
+
const provider = remoteNamed(board.config, name)?.provider ?? name;
|
|
230
|
+
const periodMapping = normalizePeriodMapping(remote.mapping['periods']);
|
|
231
|
+
return planCoverage({
|
|
232
|
+
board: viewOf(board),
|
|
233
|
+
mirrored: new Set(store.links.keys()),
|
|
234
|
+
tombstoned: new Set(store.tombstones.keys()),
|
|
235
|
+
...(remote.scope !== undefined ? { scope: remote.scope } : {}),
|
|
236
|
+
...(periodMapping !== undefined ? { periodContainer: periodMapping.container } : {}),
|
|
237
|
+
remote: {
|
|
238
|
+
name,
|
|
239
|
+
provider,
|
|
240
|
+
target: describeTarget(provider, remote.connection),
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/remote/coverage.ts"],"names":[],"mappings":"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"}
|