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,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recorded traffic fixtures (LP-301): capture what a real tracker actually
|
|
3
|
+
* returns, scrub every secret on the way in, and replay the capture offline.
|
|
4
|
+
*
|
|
5
|
+
* This is the third leg of the plug-and-play test story (LP-292), beside the
|
|
6
|
+
* in-memory tracker (LP-299) and the conformance suite (LP-300). The tracker
|
|
7
|
+
* tests the *algorithm*; a recording tests the *parsing* against reality —
|
|
8
|
+
* the exact response shapes, status codes and error bodies a real platform
|
|
9
|
+
* sent, not the author's reading of the docs.
|
|
10
|
+
*
|
|
11
|
+
* Two connectors, one file format:
|
|
12
|
+
*
|
|
13
|
+
* - `recordingConnector` wraps a transport `Connector` and records every
|
|
14
|
+
* request/response exchange, scrubbed, into a session. It is a no-op
|
|
15
|
+
* unless `LPM_RECORD=1` (or `enabled: true`), and it flushes the session
|
|
16
|
+
* to `<directory>/<provider>/recording.json` on `close()`.
|
|
17
|
+
* - `replayConnector` reads that file and serves the recorded responses. An
|
|
18
|
+
* unmatched request fails loudly (`UnmatchedReplayRequestError`) rather
|
|
19
|
+
* than falling through to the network — a silent network fallback would
|
|
20
|
+
* make the offline promise meaningless.
|
|
21
|
+
*
|
|
22
|
+
* Scrubbing is the same rule as the output redactor (LP-296) plus two shapes a
|
|
23
|
+
* recording adds over a log line: **emails** and **account ids**. A recording
|
|
24
|
+
* is committed to the repo, so it must be clean by construction — the marker is
|
|
25
|
+
* `***`, replacement never omission, and a test
|
|
26
|
+
* (`test/remote-fixtures.test.ts`) asserts every committed fixture is already
|
|
27
|
+
* clean.
|
|
28
|
+
*
|
|
29
|
+
* A recording carries a `captured_at` date because recordings age silently:
|
|
30
|
+
* they keep passing after the platform changes. The live suite (LP-301,
|
|
31
|
+
* `LPM_LIVE=1`) is the thing that catches that drift — run it deliberately,
|
|
32
|
+
* never by accident.
|
|
33
|
+
*/
|
|
34
|
+
import type { Connector, ConnectorKind, RemoteRequest } from './transport/connector.js';
|
|
35
|
+
import { type RemoteApiCode, type RemoteErrorKind } from './transport/error.js';
|
|
36
|
+
/** One recorded request, in transport vocabulary, scrubbed. */
|
|
37
|
+
export interface RecordedRequest {
|
|
38
|
+
method: string;
|
|
39
|
+
path: string;
|
|
40
|
+
query?: Record<string, string>;
|
|
41
|
+
headers?: Record<string, string>;
|
|
42
|
+
body?: unknown;
|
|
43
|
+
purpose?: string;
|
|
44
|
+
idempotencyKey?: string;
|
|
45
|
+
}
|
|
46
|
+
/** One recorded response. `body` is `null` for a 204 or an empty body. */
|
|
47
|
+
export interface RecordedResponse {
|
|
48
|
+
status: number;
|
|
49
|
+
ok: boolean;
|
|
50
|
+
headers: Record<string, string>;
|
|
51
|
+
body: unknown;
|
|
52
|
+
}
|
|
53
|
+
/** One recorded failure, carrying everything `RemoteError` needs to be rethrown. */
|
|
54
|
+
export interface RecordedError {
|
|
55
|
+
kind: RemoteErrorKind;
|
|
56
|
+
status: number | null;
|
|
57
|
+
code: RemoteApiCode | null;
|
|
58
|
+
retryable: boolean;
|
|
59
|
+
retryAfterMs: number | null;
|
|
60
|
+
purpose: string;
|
|
61
|
+
providerMessage: string | null;
|
|
62
|
+
detail: string;
|
|
63
|
+
}
|
|
64
|
+
/** One exchange: a request and either the response it got or the error it raised. */
|
|
65
|
+
export type RecordedExchange = {
|
|
66
|
+
request: RecordedRequest;
|
|
67
|
+
response: RecordedResponse;
|
|
68
|
+
} | {
|
|
69
|
+
request: RecordedRequest;
|
|
70
|
+
error: RecordedError;
|
|
71
|
+
};
|
|
72
|
+
/** A recording session: provenance plus the ordered exchange transcript. */
|
|
73
|
+
export interface RecordedSession {
|
|
74
|
+
/** Provider the recording was taken against, e.g. `github`. */
|
|
75
|
+
provider: string;
|
|
76
|
+
/** Transport family the recording came from; replay reports the same `kind`. */
|
|
77
|
+
kind: ConnectorKind;
|
|
78
|
+
/** ISO capture timestamp. Recordings age silently; this says how old this one is. */
|
|
79
|
+
captured_at: string;
|
|
80
|
+
/** Human-readable capture date (`YYYY-MM-DD`). */
|
|
81
|
+
captured_date: string;
|
|
82
|
+
/** The connector's base URL, when known (provenance, never used for matching). */
|
|
83
|
+
base_url?: string;
|
|
84
|
+
/** A provenance note, e.g. how the recording was taken. */
|
|
85
|
+
note?: string;
|
|
86
|
+
exchanges: RecordedExchange[];
|
|
87
|
+
}
|
|
88
|
+
/** What `scrub*` replaces. */
|
|
89
|
+
export interface ScrubOptions {
|
|
90
|
+
/** Secret values to redact (raw and percent-encoded). */
|
|
91
|
+
secrets?: readonly string[];
|
|
92
|
+
/** Account ids / repo owners to scrub out of text and URLs. */
|
|
93
|
+
accounts?: readonly string[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Scrub one string: secrets first (raw and percent-encoded, exactly as the
|
|
97
|
+
* output redactor does), then emails, then account ids. The order means a
|
|
98
|
+
* secret wins over any account id it happens to contain.
|
|
99
|
+
*/
|
|
100
|
+
export declare function scrubText(text: string, options?: ScrubOptions): string;
|
|
101
|
+
/** Scrub a value recursively: strings directly, arrays and objects element-wise. */
|
|
102
|
+
export declare function scrubValue(value: unknown, options?: ScrubOptions): unknown;
|
|
103
|
+
/**
|
|
104
|
+
* Scrub a headers record. A header whose *value* carries a secret, or whose
|
|
105
|
+
* *name* is a secret header (`Authorization`, `X-Api-Key`, …), becomes
|
|
106
|
+
* `REDACTED` whole; the rest are scrubbed for emails and account ids. Header
|
|
107
|
+
* names are fixed vocabulary and are never touched.
|
|
108
|
+
*/
|
|
109
|
+
export declare function scrubHeaders(headers: Readonly<Record<string, string>> | undefined, options?: ScrubOptions): Record<string, string> | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* Scrub a whole session's exchanges. The provenance header (provider, dates,
|
|
112
|
+
* base URL, note) is left alone — it is documentation, not traffic. Used by
|
|
113
|
+
* the clean-fixtures test to assert a committed recording is already clean:
|
|
114
|
+
* scrubbing it again must change nothing.
|
|
115
|
+
*/
|
|
116
|
+
export declare function scrubSession(session: RecordedSession, options?: ScrubOptions): RecordedSession;
|
|
117
|
+
/** The file a provider's recording lives in, under `<directory>/<provider>/`. */
|
|
118
|
+
export declare function sessionFileName(directory: string, provider: string): string;
|
|
119
|
+
/** Write a session to `<directory>/<provider>/recording.json`, creating the folder. */
|
|
120
|
+
export declare function writeSession(session: RecordedSession, directory: string): string;
|
|
121
|
+
/** Read a recording session, failing loudly when the file is missing or malformed. */
|
|
122
|
+
export declare function readSession(file: string): RecordedSession;
|
|
123
|
+
export interface RecordingOptions extends ScrubOptions {
|
|
124
|
+
/** Directory the `<provider>/recording.json` is written under. Defaults to
|
|
125
|
+
* `test/fixtures/remote`, the path the story (LP-301) names — pass an
|
|
126
|
+
* explicit directory in tests so committed fixtures are never overwritten. */
|
|
127
|
+
directory?: string;
|
|
128
|
+
/** Provider name, e.g. `github`. */
|
|
129
|
+
provider: string;
|
|
130
|
+
/** Record only when true; defaults to `LPM_RECORD === '1'`. */
|
|
131
|
+
enabled?: boolean;
|
|
132
|
+
/** The connector's base URL, recorded for provenance only. */
|
|
133
|
+
baseUrl?: string;
|
|
134
|
+
/** A provenance note written into the session. */
|
|
135
|
+
note?: string;
|
|
136
|
+
/** Injectable clock for the capture date (tests). */
|
|
137
|
+
now?: () => Date;
|
|
138
|
+
}
|
|
139
|
+
/** The directory a recording lands in when the caller does not name one (LP-301). */
|
|
140
|
+
export declare const DEFAULT_FIXTURES_DIRECTORY = "test/fixtures/remote";
|
|
141
|
+
/**
|
|
142
|
+
* Wrap a transport `Connector` so every request — and every page of a
|
|
143
|
+
* `paginate` walk, because REST and GraphQL page through their own `request`
|
|
144
|
+
* — is recorded, scrubbed, and flushed to disk on `close()`.
|
|
145
|
+
*
|
|
146
|
+
* Off unless `LPM_RECORD=1` (or `enabled: true`): production and the default
|
|
147
|
+
* test run stay untouched, so recording is deliberate, exactly as the live
|
|
148
|
+
* suite is. The process-wide redactor's registered secrets are scrubbed in
|
|
149
|
+
* addition to any `secrets` passed explicitly, so a connector built through
|
|
150
|
+
* `buildConnector` (which registers its resolved credentials) is covered
|
|
151
|
+
* without the caller re-listing them.
|
|
152
|
+
*/
|
|
153
|
+
export declare function recordingConnector(inner: Connector, options: RecordingOptions): Connector;
|
|
154
|
+
/** A replay request matched nothing in the recording — the offline promise holds. */
|
|
155
|
+
export declare class UnmatchedReplayRequestError extends Error {
|
|
156
|
+
readonly request: RemoteRequest;
|
|
157
|
+
readonly file: string;
|
|
158
|
+
constructor(request: RemoteRequest, file: string, expected?: RecordedRequest);
|
|
159
|
+
}
|
|
160
|
+
export interface ReplayOptions {
|
|
161
|
+
/** Path to the recording JSON file. */
|
|
162
|
+
file: string;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* A `Connector` that serves a recording instead of talking to a network.
|
|
166
|
+
*
|
|
167
|
+
* Replay is a faithful transcript: each `request()` must match the *next*
|
|
168
|
+
* recorded exchange (method, path and query), or it fails loudly — there is
|
|
169
|
+
* no fall-through to the network, because a replay that silently degrades to
|
|
170
|
+
* live traffic would reintroduce exactly the flakiness and tokens the fixture
|
|
171
|
+
* exists to remove. A recorded failure is rethrown as a `RemoteError`, so a
|
|
172
|
+
* replay can exercise the error paths too. `paginate` walks the recording the
|
|
173
|
+
* same way a live connector walks a collection (Link header / cursor), each
|
|
174
|
+
* page served by `request`.
|
|
175
|
+
*/
|
|
176
|
+
export declare function replayConnector(options: ReplayOptions): Connector;
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recorded traffic fixtures (LP-301): capture what a real tracker actually
|
|
3
|
+
* returns, scrub every secret on the way in, and replay the capture offline.
|
|
4
|
+
*
|
|
5
|
+
* This is the third leg of the plug-and-play test story (LP-292), beside the
|
|
6
|
+
* in-memory tracker (LP-299) and the conformance suite (LP-300). The tracker
|
|
7
|
+
* tests the *algorithm*; a recording tests the *parsing* against reality —
|
|
8
|
+
* the exact response shapes, status codes and error bodies a real platform
|
|
9
|
+
* sent, not the author's reading of the docs.
|
|
10
|
+
*
|
|
11
|
+
* Two connectors, one file format:
|
|
12
|
+
*
|
|
13
|
+
* - `recordingConnector` wraps a transport `Connector` and records every
|
|
14
|
+
* request/response exchange, scrubbed, into a session. It is a no-op
|
|
15
|
+
* unless `LPM_RECORD=1` (or `enabled: true`), and it flushes the session
|
|
16
|
+
* to `<directory>/<provider>/recording.json` on `close()`.
|
|
17
|
+
* - `replayConnector` reads that file and serves the recorded responses. An
|
|
18
|
+
* unmatched request fails loudly (`UnmatchedReplayRequestError`) rather
|
|
19
|
+
* than falling through to the network — a silent network fallback would
|
|
20
|
+
* make the offline promise meaningless.
|
|
21
|
+
*
|
|
22
|
+
* Scrubbing is the same rule as the output redactor (LP-296) plus two shapes a
|
|
23
|
+
* recording adds over a log line: **emails** and **account ids**. A recording
|
|
24
|
+
* is committed to the repo, so it must be clean by construction — the marker is
|
|
25
|
+
* `***`, replacement never omission, and a test
|
|
26
|
+
* (`test/remote-fixtures.test.ts`) asserts every committed fixture is already
|
|
27
|
+
* clean.
|
|
28
|
+
*
|
|
29
|
+
* A recording carries a `captured_at` date because recordings age silently:
|
|
30
|
+
* they keep passing after the platform changes. The live suite (LP-301,
|
|
31
|
+
* `LPM_LIVE=1`) is the thing that catches that drift — run it deliberately,
|
|
32
|
+
* never by accident.
|
|
33
|
+
*/
|
|
34
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
35
|
+
import { join } from 'node:path';
|
|
36
|
+
import { redactHeaders, redactText, redactor, REDACTED } from './redact.js';
|
|
37
|
+
import { RemoteError } from './transport/error.js';
|
|
38
|
+
import { nextLink, readPath } from './transport/http.js';
|
|
39
|
+
/** Header names that carry a secret by definition, redacted whole whatever the value. */
|
|
40
|
+
const SECRET_HEADER_NAMES = new Set([
|
|
41
|
+
'authorization',
|
|
42
|
+
'proxy-authorization',
|
|
43
|
+
'x-api-key',
|
|
44
|
+
'api-key',
|
|
45
|
+
'apikey',
|
|
46
|
+
'cookie',
|
|
47
|
+
'set-cookie',
|
|
48
|
+
]);
|
|
49
|
+
/** An email address — the one shape a recording must never keep. */
|
|
50
|
+
const EMAIL_RE = /[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+/g;
|
|
51
|
+
/**
|
|
52
|
+
* Scrub one string: secrets first (raw and percent-encoded, exactly as the
|
|
53
|
+
* output redactor does), then emails, then account ids. The order means a
|
|
54
|
+
* secret wins over any account id it happens to contain.
|
|
55
|
+
*/
|
|
56
|
+
export function scrubText(text, options = {}) {
|
|
57
|
+
let out = redactText(text, options.secrets ?? []);
|
|
58
|
+
out = out.replace(EMAIL_RE, REDACTED);
|
|
59
|
+
for (const account of options.accounts ?? []) {
|
|
60
|
+
if (account.length === 0)
|
|
61
|
+
continue;
|
|
62
|
+
out = out.split(account).join(REDACTED);
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/** Scrub a value recursively: strings directly, arrays and objects element-wise. */
|
|
67
|
+
export function scrubValue(value, options = {}) {
|
|
68
|
+
if (typeof value === 'string')
|
|
69
|
+
return scrubText(value, options);
|
|
70
|
+
if (Array.isArray(value))
|
|
71
|
+
return value.map((entry) => scrubValue(entry, options));
|
|
72
|
+
if (value !== null && typeof value === 'object') {
|
|
73
|
+
const out = {};
|
|
74
|
+
for (const [key, entry] of Object.entries(value))
|
|
75
|
+
out[key] = scrubValue(entry, options);
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Scrub a headers record. A header whose *value* carries a secret, or whose
|
|
82
|
+
* *name* is a secret header (`Authorization`, `X-Api-Key`, …), becomes
|
|
83
|
+
* `REDACTED` whole; the rest are scrubbed for emails and account ids. Header
|
|
84
|
+
* names are fixed vocabulary and are never touched.
|
|
85
|
+
*/
|
|
86
|
+
export function scrubHeaders(headers, options = {}) {
|
|
87
|
+
if (headers === undefined)
|
|
88
|
+
return undefined;
|
|
89
|
+
const redacted = redactHeaders(headers, options.secrets ?? []);
|
|
90
|
+
const out = {};
|
|
91
|
+
for (const [name, value] of Object.entries(redacted)) {
|
|
92
|
+
out[name] = SECRET_HEADER_NAMES.has(name.toLowerCase()) ? REDACTED : scrubText(value, options);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
function scrubRecordedRequest(request, options) {
|
|
97
|
+
return {
|
|
98
|
+
method: request.method,
|
|
99
|
+
path: scrubText(request.path, options),
|
|
100
|
+
query: request.query === undefined
|
|
101
|
+
? undefined
|
|
102
|
+
: scrubValue(request.query, options),
|
|
103
|
+
headers: scrubHeaders(request.headers, options),
|
|
104
|
+
body: request.body === undefined ? undefined : scrubValue(request.body, options),
|
|
105
|
+
purpose: request.purpose === undefined ? undefined : scrubText(request.purpose, options),
|
|
106
|
+
idempotencyKey: request.idempotencyKey === undefined
|
|
107
|
+
? undefined
|
|
108
|
+
: scrubText(request.idempotencyKey, options),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function scrubRecordedResponse(response, options) {
|
|
112
|
+
return {
|
|
113
|
+
status: response.status,
|
|
114
|
+
ok: response.ok,
|
|
115
|
+
headers: scrubHeaders(response.headers, options) ?? {},
|
|
116
|
+
body: scrubValue(response.body, options),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function scrubRecordedError(error, options) {
|
|
120
|
+
return {
|
|
121
|
+
kind: error.kind,
|
|
122
|
+
status: error.status,
|
|
123
|
+
code: error.code,
|
|
124
|
+
retryable: error.retryable,
|
|
125
|
+
retryAfterMs: error.retryAfterMs,
|
|
126
|
+
purpose: scrubText(error.purpose, options),
|
|
127
|
+
providerMessage: error.providerMessage === null ? null : scrubText(error.providerMessage, options),
|
|
128
|
+
detail: scrubText(error.detail, options),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function scrubExchange(exchange, options) {
|
|
132
|
+
const request = scrubRecordedRequest(exchange.request, options);
|
|
133
|
+
if ('error' in exchange)
|
|
134
|
+
return { request, error: scrubRecordedError(exchange.error, options) };
|
|
135
|
+
return { request, response: scrubRecordedResponse(exchange.response, options) };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Scrub a whole session's exchanges. The provenance header (provider, dates,
|
|
139
|
+
* base URL, note) is left alone — it is documentation, not traffic. Used by
|
|
140
|
+
* the clean-fixtures test to assert a committed recording is already clean:
|
|
141
|
+
* scrubbing it again must change nothing.
|
|
142
|
+
*/
|
|
143
|
+
export function scrubSession(session, options = {}) {
|
|
144
|
+
return { ...session, exchanges: session.exchanges.map((e) => scrubExchange(e, options)) };
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Session I/O
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
/** The file a provider's recording lives in, under `<directory>/<provider>/`. */
|
|
150
|
+
export function sessionFileName(directory, provider) {
|
|
151
|
+
return join(directory, provider, 'recording.json');
|
|
152
|
+
}
|
|
153
|
+
/** Write a session to `<directory>/<provider>/recording.json`, creating the folder. */
|
|
154
|
+
export function writeSession(session, directory) {
|
|
155
|
+
const file = sessionFileName(directory, session.provider);
|
|
156
|
+
mkdirSync(join(directory, session.provider), { recursive: true });
|
|
157
|
+
writeFileSync(file, `${JSON.stringify(session, null, 2)}\n`);
|
|
158
|
+
return file;
|
|
159
|
+
}
|
|
160
|
+
/** Read a recording session, failing loudly when the file is missing or malformed. */
|
|
161
|
+
export function readSession(file) {
|
|
162
|
+
let text;
|
|
163
|
+
try {
|
|
164
|
+
text = readFileSync(file, 'utf8');
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
throw new Error(`replay: cannot read fixture ${file}: ${error.message}`);
|
|
168
|
+
}
|
|
169
|
+
let parsed;
|
|
170
|
+
try {
|
|
171
|
+
parsed = JSON.parse(text);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
throw new Error(`replay: fixture ${file} is not valid JSON: ${error.message}`);
|
|
175
|
+
}
|
|
176
|
+
if (parsed === null ||
|
|
177
|
+
typeof parsed !== 'object' ||
|
|
178
|
+
!Array.isArray(parsed['exchanges'])) {
|
|
179
|
+
throw new Error(`replay: fixture ${file} has no exchanges — re-record with LPM_RECORD=1`);
|
|
180
|
+
}
|
|
181
|
+
return parsed;
|
|
182
|
+
}
|
|
183
|
+
/** The directory a recording lands in when the caller does not name one (LP-301). */
|
|
184
|
+
export const DEFAULT_FIXTURES_DIRECTORY = 'test/fixtures/remote';
|
|
185
|
+
/** The query as it is matched and recorded: `undefined` dropped, numbers stringified. */
|
|
186
|
+
function normalizeQuery(query) {
|
|
187
|
+
const out = {};
|
|
188
|
+
if (query === undefined)
|
|
189
|
+
return out;
|
|
190
|
+
for (const [key, value] of Object.entries(query)) {
|
|
191
|
+
if (value !== undefined)
|
|
192
|
+
out[key] = String(value);
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
function rawRequest(req) {
|
|
197
|
+
return {
|
|
198
|
+
method: req.method,
|
|
199
|
+
path: req.path,
|
|
200
|
+
query: req.query === undefined ? undefined : normalizeQuery(req.query),
|
|
201
|
+
headers: req.headers === undefined ? undefined : { ...req.headers },
|
|
202
|
+
body: req.body,
|
|
203
|
+
purpose: req.purpose,
|
|
204
|
+
idempotencyKey: req.idempotencyKey,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function rawResponse(response) {
|
|
208
|
+
return {
|
|
209
|
+
status: response.status,
|
|
210
|
+
ok: response.ok,
|
|
211
|
+
headers: { ...response.headers },
|
|
212
|
+
body: response.body,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function rawError(error) {
|
|
216
|
+
return {
|
|
217
|
+
kind: error.kind,
|
|
218
|
+
status: error.status,
|
|
219
|
+
code: error.code,
|
|
220
|
+
retryable: error.retryable,
|
|
221
|
+
retryAfterMs: error.retryAfterMs,
|
|
222
|
+
purpose: error.purpose,
|
|
223
|
+
providerMessage: error.providerMessage,
|
|
224
|
+
detail: error.detail,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Wrap a transport `Connector` so every request — and every page of a
|
|
229
|
+
* `paginate` walk, because REST and GraphQL page through their own `request`
|
|
230
|
+
* — is recorded, scrubbed, and flushed to disk on `close()`.
|
|
231
|
+
*
|
|
232
|
+
* Off unless `LPM_RECORD=1` (or `enabled: true`): production and the default
|
|
233
|
+
* test run stay untouched, so recording is deliberate, exactly as the live
|
|
234
|
+
* suite is. The process-wide redactor's registered secrets are scrubbed in
|
|
235
|
+
* addition to any `secrets` passed explicitly, so a connector built through
|
|
236
|
+
* `buildConnector` (which registers its resolved credentials) is covered
|
|
237
|
+
* without the caller re-listing them.
|
|
238
|
+
*/
|
|
239
|
+
export function recordingConnector(inner, options) {
|
|
240
|
+
const enabled = options.enabled ?? process.env.LPM_RECORD === '1';
|
|
241
|
+
if (!enabled)
|
|
242
|
+
return inner;
|
|
243
|
+
const directory = options.directory ?? DEFAULT_FIXTURES_DIRECTORY;
|
|
244
|
+
const secrets = [...(options.secrets ?? []), ...redactor.secrets()];
|
|
245
|
+
const accounts = options.accounts ?? [];
|
|
246
|
+
const scrub = { secrets, accounts };
|
|
247
|
+
const exchanges = [];
|
|
248
|
+
async function request(req) {
|
|
249
|
+
try {
|
|
250
|
+
const response = await inner.request(req);
|
|
251
|
+
exchanges.push({
|
|
252
|
+
request: scrubRecordedRequest(rawRequest(req), scrub),
|
|
253
|
+
response: scrubRecordedResponse(rawResponse(response), scrub),
|
|
254
|
+
});
|
|
255
|
+
return response;
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
if (error instanceof RemoteError) {
|
|
259
|
+
exchanges.push({
|
|
260
|
+
request: scrubRecordedRequest(rawRequest(req), scrub),
|
|
261
|
+
error: scrubRecordedError(rawError(error), scrub),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
...inner,
|
|
269
|
+
request,
|
|
270
|
+
async close() {
|
|
271
|
+
await inner.close();
|
|
272
|
+
const now = options.now?.() ?? new Date();
|
|
273
|
+
const session = {
|
|
274
|
+
provider: options.provider,
|
|
275
|
+
kind: inner.kind,
|
|
276
|
+
captured_at: now.toISOString(),
|
|
277
|
+
captured_date: now.toISOString().slice(0, 10),
|
|
278
|
+
...(options.baseUrl !== undefined ? { base_url: options.baseUrl } : {}),
|
|
279
|
+
...(options.note !== undefined ? { note: options.note } : {}),
|
|
280
|
+
exchanges,
|
|
281
|
+
};
|
|
282
|
+
writeSession(session, directory);
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// ---------------------------------------------------------------------------
|
|
287
|
+
// Replay
|
|
288
|
+
// ---------------------------------------------------------------------------
|
|
289
|
+
/** A replay request matched nothing in the recording — the offline promise holds. */
|
|
290
|
+
export class UnmatchedReplayRequestError extends Error {
|
|
291
|
+
request;
|
|
292
|
+
file;
|
|
293
|
+
constructor(request, file, expected) {
|
|
294
|
+
const got = `${request.method} ${request.path}`;
|
|
295
|
+
const want = expected === undefined ? 'no exchange' : `${expected.method} ${expected.path}`;
|
|
296
|
+
super(`replay: ${got} did not match the next recorded exchange (${want}) in ${file} — re-record with LPM_RECORD=1`);
|
|
297
|
+
this.name = 'UnmatchedReplayRequestError';
|
|
298
|
+
this.request = request;
|
|
299
|
+
this.file = file;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function sameQuery(a, b) {
|
|
303
|
+
const keysA = Object.keys(a).sort();
|
|
304
|
+
const keysB = Object.keys(b).sort();
|
|
305
|
+
if (keysA.length !== keysB.length)
|
|
306
|
+
return false;
|
|
307
|
+
for (let i = 0; i < keysA.length; i += 1) {
|
|
308
|
+
const key = keysA[i];
|
|
309
|
+
if (key !== keysB[i] || a[key] !== b[key])
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
function matches(req, recorded) {
|
|
315
|
+
if (req.method !== recorded.method)
|
|
316
|
+
return false;
|
|
317
|
+
if (req.path !== recorded.path)
|
|
318
|
+
return false;
|
|
319
|
+
return sameQuery(normalizeQuery(req.query), recorded.query ?? {});
|
|
320
|
+
}
|
|
321
|
+
/** Read `pageInfo` from a decoded GraphQL body, exactly as the GraphQL connector does. */
|
|
322
|
+
function pageInfoOf(body, path) {
|
|
323
|
+
const raw = readPath(body, path);
|
|
324
|
+
const value = raw;
|
|
325
|
+
return {
|
|
326
|
+
hasNextPage: value?.hasNextPage === true,
|
|
327
|
+
endCursor: typeof value?.endCursor === 'string' ? value.endCursor : null,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
function remoteErrorOf(recorded) {
|
|
331
|
+
return new RemoteError({
|
|
332
|
+
kind: recorded.kind,
|
|
333
|
+
status: recorded.status,
|
|
334
|
+
code: recorded.code,
|
|
335
|
+
retryable: recorded.retryable,
|
|
336
|
+
retryAfterMs: recorded.retryAfterMs,
|
|
337
|
+
purpose: recorded.purpose,
|
|
338
|
+
providerMessage: recorded.providerMessage,
|
|
339
|
+
detail: recorded.detail,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* A `Connector` that serves a recording instead of talking to a network.
|
|
344
|
+
*
|
|
345
|
+
* Replay is a faithful transcript: each `request()` must match the *next*
|
|
346
|
+
* recorded exchange (method, path and query), or it fails loudly — there is
|
|
347
|
+
* no fall-through to the network, because a replay that silently degrades to
|
|
348
|
+
* live traffic would reintroduce exactly the flakiness and tokens the fixture
|
|
349
|
+
* exists to remove. A recorded failure is rethrown as a `RemoteError`, so a
|
|
350
|
+
* replay can exercise the error paths too. `paginate` walks the recording the
|
|
351
|
+
* same way a live connector walks a collection (Link header / cursor), each
|
|
352
|
+
* page served by `request`.
|
|
353
|
+
*/
|
|
354
|
+
export function replayConnector(options) {
|
|
355
|
+
const session = readSession(options.file);
|
|
356
|
+
const exchanges = session.exchanges;
|
|
357
|
+
let next = 0;
|
|
358
|
+
async function request(req) {
|
|
359
|
+
const exchange = exchanges[next];
|
|
360
|
+
if (exchange === undefined || !matches(req, exchange.request)) {
|
|
361
|
+
throw new UnmatchedReplayRequestError(req, options.file, exchange?.request);
|
|
362
|
+
}
|
|
363
|
+
next += 1;
|
|
364
|
+
if ('error' in exchange)
|
|
365
|
+
throw remoteErrorOf(exchange.error);
|
|
366
|
+
const response = exchange.response;
|
|
367
|
+
return {
|
|
368
|
+
status: response.status,
|
|
369
|
+
ok: response.ok,
|
|
370
|
+
headers: response.headers,
|
|
371
|
+
body: response.body,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
async function* paginate(req) {
|
|
375
|
+
const spec = req.pagination;
|
|
376
|
+
// No spec: the collection is one page.
|
|
377
|
+
if (spec === undefined) {
|
|
378
|
+
const response = await request(req);
|
|
379
|
+
if (response.body !== null)
|
|
380
|
+
yield response.body;
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
// GraphQL: drive `pageInfo` cursors, exactly as the GraphQL connector does.
|
|
384
|
+
if (spec.kind === 'graphql') {
|
|
385
|
+
const body = req.body;
|
|
386
|
+
const query = typeof body?.query === 'string' ? body.query : '';
|
|
387
|
+
const variables = { ...(body?.variables ?? {}) };
|
|
388
|
+
variables[spec.pageSizeVariable] = spec.pageSize;
|
|
389
|
+
for (;;) {
|
|
390
|
+
const current = {
|
|
391
|
+
...req,
|
|
392
|
+
method: 'POST',
|
|
393
|
+
query: undefined,
|
|
394
|
+
body: { query, variables },
|
|
395
|
+
};
|
|
396
|
+
const response = await request(current);
|
|
397
|
+
if (response.body !== null)
|
|
398
|
+
yield response.body;
|
|
399
|
+
const pageInfo = pageInfoOf(response.body, spec.pageInfoPath);
|
|
400
|
+
if (!pageInfo.hasNextPage || pageInfo.endCursor === null)
|
|
401
|
+
return;
|
|
402
|
+
variables[spec.cursorVariable] = pageInfo.endCursor;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// REST: follow a Link header or a cursor, each page served by `request`.
|
|
406
|
+
let current = req;
|
|
407
|
+
for (;;) {
|
|
408
|
+
const response = await request(current);
|
|
409
|
+
if (response.body !== null)
|
|
410
|
+
yield response.body;
|
|
411
|
+
if (spec.kind === 'link') {
|
|
412
|
+
const nextUrl = nextLink(response.headers);
|
|
413
|
+
if (nextUrl === null)
|
|
414
|
+
return;
|
|
415
|
+
current = { ...req, path: nextUrl, query: undefined };
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
const cursor = readPath(response.body, spec.nextCursorPath);
|
|
419
|
+
if (cursor === null || cursor === undefined || cursor === '')
|
|
420
|
+
return;
|
|
421
|
+
current = { ...req, query: { ...req.query, [spec.cursorParam]: String(cursor) } };
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
kind: session.kind,
|
|
427
|
+
request,
|
|
428
|
+
paginate,
|
|
429
|
+
async close() { },
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/remote/fixtures.ts"],"names":[],"mappings":"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"}
|