@slope-dev/slope 1.64.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/cli/commands/agent.d.ts +3 -3
- package/dist/cli/commands/agent.d.ts.map +1 -1
- package/dist/cli/commands/agent.js +20 -12
- package/dist/cli/commands/agent.js.map +1 -1
- package/dist/cli/commands/auto-card.d.ts +2 -1
- package/dist/cli/commands/auto-card.d.ts.map +1 -1
- package/dist/cli/commands/auto-card.js +7 -7
- package/dist/cli/commands/auto-card.js.map +1 -1
- package/dist/cli/commands/briefing.d.ts.map +1 -1
- package/dist/cli/commands/briefing.js +16 -9
- package/dist/cli/commands/briefing.js.map +1 -1
- package/dist/cli/commands/claim.d.ts.map +1 -1
- package/dist/cli/commands/claim.js +6 -4
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/commit-ready.d.ts.map +1 -1
- package/dist/cli/commands/commit-ready.js.map +1 -1
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +2 -1
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +3 -3
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/distill.d.ts.map +1 -1
- package/dist/cli/commands/distill.js +8 -20
- package/dist/cli/commands/distill.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts.map +1 -1
- package/dist/cli/commands/enrich.js +2 -1
- package/dist/cli/commands/enrich.js.map +1 -1
- package/dist/cli/commands/escalate.d.ts.map +1 -1
- package/dist/cli/commands/escalate.js +11 -3
- package/dist/cli/commands/escalate.js.map +1 -1
- package/dist/cli/commands/extract.d.ts.map +1 -1
- package/dist/cli/commands/extract.js +20 -6
- package/dist/cli/commands/extract.js.map +1 -1
- package/dist/cli/commands/gate.d.ts.map +1 -1
- package/dist/cli/commands/gate.js +10 -7
- package/dist/cli/commands/gate.js.map +1 -1
- package/dist/cli/commands/index-cmd.d.ts.map +1 -1
- package/dist/cli/commands/index-cmd.js +2 -1
- package/dist/cli/commands/index-cmd.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +26 -12
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/initiative.d.ts.map +1 -1
- package/dist/cli/commands/initiative.js +9 -8
- package/dist/cli/commands/initiative.js.map +1 -1
- package/dist/cli/commands/inspirations.js +5 -5
- package/dist/cli/commands/inspirations.js.map +1 -1
- package/dist/cli/commands/interview.d.ts.map +1 -1
- package/dist/cli/commands/interview.js +2 -2
- package/dist/cli/commands/interview.js.map +1 -1
- package/dist/cli/commands/issue.d.ts.map +1 -1
- package/dist/cli/commands/issue.js +6 -9
- package/dist/cli/commands/issue.js.map +1 -1
- package/dist/cli/commands/map.d.ts +1 -1
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +34 -10
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/next.js +2 -2
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/now.d.ts +2 -2
- package/dist/cli/commands/now.d.ts.map +1 -1
- package/dist/cli/commands/now.js +23 -15
- package/dist/cli/commands/now.js.map +1 -1
- package/dist/cli/commands/pr.d.ts +3 -3
- package/dist/cli/commands/pr.d.ts.map +1 -1
- package/dist/cli/commands/pr.js +9 -8
- package/dist/cli/commands/pr.js.map +1 -1
- package/dist/cli/commands/prep.d.ts.map +1 -1
- package/dist/cli/commands/prep.js +2 -1
- package/dist/cli/commands/prep.js.map +1 -1
- package/dist/cli/commands/release.d.ts.map +1 -1
- package/dist/cli/commands/release.js +9 -11
- package/dist/cli/commands/release.js.map +1 -1
- package/dist/cli/commands/retro.d.ts +1 -1
- package/dist/cli/commands/retro.d.ts.map +1 -1
- package/dist/cli/commands/retro.js +35 -11
- package/dist/cli/commands/retro.js.map +1 -1
- package/dist/cli/commands/review-packet.d.ts +2 -2
- package/dist/cli/commands/review-packet.d.ts.map +1 -1
- package/dist/cli/commands/review-packet.js +3 -3
- package/dist/cli/commands/review-packet.js.map +1 -1
- package/dist/cli/commands/review-run.d.ts +3 -2
- package/dist/cli/commands/review-run.d.ts.map +1 -1
- package/dist/cli/commands/review-run.js +4 -4
- package/dist/cli/commands/review-run.js.map +1 -1
- package/dist/cli/commands/review-state.d.ts.map +1 -1
- package/dist/cli/commands/review-state.js +57 -30
- package/dist/cli/commands/review-state.js.map +1 -1
- package/dist/cli/commands/review.js +6 -6
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +138 -78
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +47 -16
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/sprint-plan.d.ts.map +1 -1
- package/dist/cli/commands/sprint-plan.js +10 -8
- package/dist/cli/commands/sprint-plan.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +253 -38
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/standup.d.ts.map +1 -1
- package/dist/cli/commands/standup.js +9 -4
- package/dist/cli/commands/standup.js.map +1 -1
- package/dist/cli/commands/start.js +2 -2
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/stats.d.ts +4 -4
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +5 -5
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +12 -8
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/store.d.ts +37 -0
- package/dist/cli/commands/store.d.ts.map +1 -1
- package/dist/cli/commands/store.js +262 -12
- package/dist/cli/commands/store.js.map +1 -1
- package/dist/cli/commands/ticket.d.ts.map +1 -1
- package/dist/cli/commands/ticket.js +4 -4
- package/dist/cli/commands/ticket.js.map +1 -1
- package/dist/cli/commands/tournament.d.ts.map +1 -1
- package/dist/cli/commands/tournament.js +7 -6
- package/dist/cli/commands/tournament.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +4 -3
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +37 -10
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/version.d.ts +1 -1
- package/dist/cli/commands/version.d.ts.map +1 -1
- package/dist/cli/commands/version.js +13 -10
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/commands/worktree.d.ts.map +1 -1
- package/dist/cli/commands/worktree.js +36 -31
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/guards/claim-required.d.ts.map +1 -1
- package/dist/cli/guards/claim-required.js +2 -3
- package/dist/cli/guards/claim-required.js.map +1 -1
- package/dist/cli/guards/compaction.d.ts.map +1 -1
- package/dist/cli/guards/git-utils.d.ts +5 -0
- package/dist/cli/guards/git-utils.d.ts.map +1 -1
- package/dist/cli/guards/git-utils.js +36 -8
- package/dist/cli/guards/git-utils.js.map +1 -1
- package/dist/cli/guards/hazard.d.ts.map +1 -1
- package/dist/cli/guards/hazard.js +8 -7
- package/dist/cli/guards/hazard.js.map +1 -1
- package/dist/cli/guards/next-action.d.ts +5 -5
- package/dist/cli/guards/next-action.d.ts.map +1 -1
- package/dist/cli/guards/next-action.js +8 -8
- package/dist/cli/guards/next-action.js.map +1 -1
- package/dist/cli/guards/phase-boundary.d.ts.map +1 -1
- package/dist/cli/guards/phase-boundary.js +24 -14
- package/dist/cli/guards/phase-boundary.js.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.d.ts.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.js +9 -8
- package/dist/cli/guards/post-hole-enforcement.js.map +1 -1
- package/dist/cli/guards/post-push.d.ts.map +1 -1
- package/dist/cli/guards/post-push.js +7 -3
- package/dist/cli/guards/post-push.js.map +1 -1
- package/dist/cli/guards/review-stale.d.ts.map +1 -1
- package/dist/cli/guards/review-stale.js +6 -4
- package/dist/cli/guards/review-stale.js.map +1 -1
- package/dist/cli/guards/review-tier.d.ts.map +1 -1
- package/dist/cli/guards/review-tier.js +6 -7
- package/dist/cli/guards/review-tier.js.map +1 -1
- package/dist/cli/guards/roadmap-edit-shipped.d.ts.map +1 -1
- package/dist/cli/guards/roadmap-edit-shipped.js +34 -21
- package/dist/cli/guards/roadmap-edit-shipped.js.map +1 -1
- package/dist/cli/guards/scope-drift.d.ts.map +1 -1
- package/dist/cli/guards/scope-drift.js +2 -1
- package/dist/cli/guards/scope-drift.js.map +1 -1
- package/dist/cli/guards/session-briefing.d.ts.map +1 -1
- package/dist/cli/guards/session-briefing.js +34 -13
- package/dist/cli/guards/session-briefing.js.map +1 -1
- package/dist/cli/guards/sprint-completion.d.ts.map +1 -1
- package/dist/cli/guards/sprint-completion.js +32 -16
- package/dist/cli/guards/sprint-completion.js.map +1 -1
- package/dist/cli/guards/stop-check.d.ts.map +1 -1
- package/dist/cli/guards/stop-check.js +8 -10
- package/dist/cli/guards/stop-check.js.map +1 -1
- package/dist/cli/guards/transcript.d.ts.map +1 -1
- package/dist/cli/guards/transcript.js +2 -1
- package/dist/cli/guards/transcript.js.map +1 -1
- package/dist/cli/guards/workflow-step-gate.d.ts.map +1 -1
- package/dist/cli/guards/workflow-step-gate.js +25 -28
- package/dist/cli/guards/workflow-step-gate.js.map +1 -1
- package/dist/cli/guards/worktree-check.d.ts.map +1 -1
- package/dist/cli/guards/worktree-check.js +38 -13
- package/dist/cli/guards/worktree-check.js.map +1 -1
- package/dist/cli/hooks-config.d.ts.map +1 -1
- package/dist/cli/hooks-config.js +6 -4
- package/dist/cli/hooks-config.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loop/executor.d.ts +1 -0
- package/dist/cli/loop/executor.d.ts.map +1 -1
- package/dist/cli/loop/executor.js +20 -13
- package/dist/cli/loop/executor.js.map +1 -1
- package/dist/cli/loop/pr-lifecycle.d.ts +2 -1
- package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -1
- package/dist/cli/loop/pr-lifecycle.js +14 -8
- package/dist/cli/loop/pr-lifecycle.js.map +1 -1
- package/dist/cli/loop/worktree.d.ts.map +1 -1
- package/dist/cli/loop/worktree.js +1 -48
- package/dist/cli/loop/worktree.js.map +1 -1
- package/dist/cli/pr-closeout.d.ts +3 -2
- package/dist/cli/pr-closeout.d.ts.map +1 -1
- package/dist/cli/pr-closeout.js +14 -6
- package/dist/cli/pr-closeout.js.map +1 -1
- package/dist/cli/pr-review-state.d.ts +8 -7
- package/dist/cli/pr-review-state.d.ts.map +1 -1
- package/dist/cli/pr-review-state.js +3 -2
- package/dist/cli/pr-review-state.js.map +1 -1
- package/dist/cli/pre-sprint-reality.d.ts +4 -4
- package/dist/cli/pre-sprint-reality.d.ts.map +1 -1
- package/dist/cli/pre-sprint-reality.js +9 -2
- package/dist/cli/pre-sprint-reality.js.map +1 -1
- package/dist/cli/registries/api-registry.d.ts +2 -2
- package/dist/cli/registries/api-registry.d.ts.map +1 -1
- package/dist/cli/registries/api-registry.js +1 -1
- package/dist/cli/registries/api-registry.js.map +1 -1
- package/dist/cli/registries/file-registry.d.ts +3 -3
- package/dist/cli/registries/file-registry.d.ts.map +1 -1
- package/dist/cli/registries/file-registry.js +12 -2
- package/dist/cli/registries/file-registry.js.map +1 -1
- package/dist/cli/registries/index.d.ts +1 -1
- package/dist/cli/registries/index.d.ts.map +1 -1
- package/dist/cli/registries/index.js +2 -2
- package/dist/cli/registries/index.js.map +1 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +4 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/reviewer-agents.d.ts +2 -1
- package/dist/cli/reviewer-agents.d.ts.map +1 -1
- package/dist/cli/reviewer-agents.js.map +1 -1
- package/dist/cli/roadmap-source-migration.d.ts.map +1 -1
- package/dist/cli/roadmap-source-migration.js +15 -13
- package/dist/cli/roadmap-source-migration.js.map +1 -1
- package/dist/cli/roadmap-source-store.d.ts +4 -4
- package/dist/cli/roadmap-source-store.d.ts.map +1 -1
- package/dist/cli/roadmap-source-store.js +38 -32
- package/dist/cli/roadmap-source-store.js.map +1 -1
- package/dist/cli/session-heartbeat.d.ts +12 -0
- package/dist/cli/session-heartbeat.d.ts.map +1 -0
- package/dist/cli/session-heartbeat.js +46 -0
- package/dist/cli/session-heartbeat.js.map +1 -0
- package/dist/cli/session-scope.d.ts.map +1 -1
- package/dist/cli/session-scope.js +4 -16
- package/dist/cli/session-scope.js.map +1 -1
- package/dist/cli/session-state.js +5 -5
- package/dist/cli/session-state.js.map +1 -1
- package/dist/cli/sprint-inference.d.ts +5 -5
- package/dist/cli/sprint-inference.d.ts.map +1 -1
- package/dist/cli/sprint-inference.js +63 -33
- package/dist/cli/sprint-inference.js.map +1 -1
- package/dist/cli/sprint-resume.d.ts +7 -7
- package/dist/cli/sprint-resume.d.ts.map +1 -1
- package/dist/cli/sprint-resume.js +43 -21
- package/dist/cli/sprint-resume.js.map +1 -1
- package/dist/cli/sprint-rollover.d.ts +19 -19
- package/dist/cli/sprint-rollover.d.ts.map +1 -1
- package/dist/cli/sprint-rollover.js +116 -69
- package/dist/cli/sprint-rollover.js.map +1 -1
- package/dist/cli/sprint-state.d.ts +8 -6
- package/dist/cli/sprint-state.d.ts.map +1 -1
- package/dist/cli/sprint-state.js +39 -12
- package/dist/cli/sprint-state.js.map +1 -1
- package/dist/cli/store.d.ts.map +1 -1
- package/dist/cli/store.js +5 -3
- package/dist/cli/store.js.map +1 -1
- package/dist/cli/workflow-closeout.d.ts +11 -0
- package/dist/cli/workflow-closeout.d.ts.map +1 -0
- package/dist/cli/workflow-closeout.js +30 -0
- package/dist/cli/workflow-closeout.js.map +1 -0
- package/dist/cli/workflow-resync.d.ts +13 -9
- package/dist/cli/workflow-resync.d.ts.map +1 -1
- package/dist/cli/workflow-resync.js +75 -22
- package/dist/cli/workflow-resync.js.map +1 -1
- package/dist/core/advisor.d.ts.map +1 -1
- package/dist/core/advisor.js +5 -2
- package/dist/core/advisor.js.map +1 -1
- package/dist/core/analytics.d.ts +2 -2
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js +4 -3
- package/dist/core/analytics.js.map +1 -1
- package/dist/core/analyzers/git.d.ts +3 -2
- package/dist/core/analyzers/git.d.ts.map +1 -1
- package/dist/core/analyzers/git.js +6 -5
- package/dist/core/analyzers/git.js.map +1 -1
- package/dist/core/briefing.d.ts +6 -5
- package/dist/core/briefing.d.ts.map +1 -1
- package/dist/core/briefing.js +52 -36
- package/dist/core/briefing.js.map +1 -1
- package/dist/core/builder.d.ts +3 -1
- package/dist/core/builder.d.ts.map +1 -1
- package/dist/core/builder.js +6 -4
- package/dist/core/builder.js.map +1 -1
- package/dist/core/config.d.ts +2 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +26 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/dashboard.d.ts +2 -2
- package/dist/core/dashboard.d.ts.map +1 -1
- package/dist/core/dashboard.js +2 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/deferred.d.ts +7 -6
- package/dist/core/deferred.d.ts.map +1 -1
- package/dist/core/deferred.js +30 -7
- package/dist/core/deferred.js.map +1 -1
- package/dist/core/enrich.d.ts +1 -1
- package/dist/core/escalation.d.ts +2 -1
- package/dist/core/escalation.d.ts.map +1 -1
- package/dist/core/escalation.js +3 -1
- package/dist/core/escalation.js.map +1 -1
- package/dist/core/event-ingestion.d.ts.map +1 -1
- package/dist/core/event-ingestion.js +8 -3
- package/dist/core/event-ingestion.js.map +1 -1
- package/dist/core/findings.d.ts +6 -4
- package/dist/core/findings.d.ts.map +1 -1
- package/dist/core/findings.js +30 -7
- package/dist/core/findings.js.map +1 -1
- package/dist/core/formatter.d.ts +2 -1
- package/dist/core/formatter.d.ts.map +1 -1
- package/dist/core/formatter.js.map +1 -1
- package/dist/core/generators/roadmap.js +2 -2
- package/dist/core/generators/roadmap.js.map +1 -1
- package/dist/core/index.d.ts +8 -5
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/initiative.d.ts +5 -4
- package/dist/core/initiative.d.ts.map +1 -1
- package/dist/core/initiative.js +39 -11
- package/dist/core/initiative.js.map +1 -1
- package/dist/core/inspirations.d.ts +4 -3
- package/dist/core/inspirations.d.ts.map +1 -1
- package/dist/core/inspirations.js +19 -4
- package/dist/core/inspirations.js.map +1 -1
- package/dist/core/interview-engine.d.ts +2 -1
- package/dist/core/interview-engine.d.ts.map +1 -1
- package/dist/core/interview-engine.js +26 -17
- package/dist/core/interview-engine.js.map +1 -1
- package/dist/core/interview-steps.d.ts.map +1 -1
- package/dist/core/interview-steps.js +7 -6
- package/dist/core/interview-steps.js.map +1 -1
- package/dist/core/interview.d.ts +2 -1
- package/dist/core/interview.d.ts.map +1 -1
- package/dist/core/interview.js +13 -7
- package/dist/core/interview.js.map +1 -1
- package/dist/core/issue-scout.d.ts +2 -1
- package/dist/core/issue-scout.d.ts.map +1 -1
- package/dist/core/issue-scout.js.map +1 -1
- package/dist/core/loader.d.ts +4 -4
- package/dist/core/loader.d.ts.map +1 -1
- package/dist/core/loader.js +71 -33
- package/dist/core/loader.js.map +1 -1
- package/dist/core/memory.d.ts.map +1 -1
- package/dist/core/memory.js +16 -6
- package/dist/core/memory.js.map +1 -1
- package/dist/core/org.d.ts +1 -1
- package/dist/core/org.d.ts.map +1 -1
- package/dist/core/org.js +2 -1
- package/dist/core/org.js.map +1 -1
- package/dist/core/pipeline.d.ts +1 -1
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +10 -6
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/player.d.ts.map +1 -1
- package/dist/core/player.js +2 -1
- package/dist/core/player.js.map +1 -1
- package/dist/core/prep.d.ts +3 -3
- package/dist/core/registry.d.ts +6 -2
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +2 -1
- package/dist/core/registry.js.map +1 -1
- package/dist/core/repo-state-scope.d.ts +27 -0
- package/dist/core/repo-state-scope.d.ts.map +1 -0
- package/dist/core/repo-state-scope.js +105 -0
- package/dist/core/repo-state-scope.js.map +1 -0
- package/dist/core/report.d.ts +1 -1
- package/dist/core/report.d.ts.map +1 -1
- package/dist/core/report.js +2 -1
- package/dist/core/report.js.map +1 -1
- package/dist/core/retro.d.ts +3 -2
- package/dist/core/retro.d.ts.map +1 -1
- package/dist/core/retro.js +6 -3
- package/dist/core/retro.js.map +1 -1
- package/dist/core/roadmap-focus.d.ts +8 -7
- package/dist/core/roadmap-focus.d.ts.map +1 -1
- package/dist/core/roadmap-focus.js +45 -34
- package/dist/core/roadmap-focus.js.map +1 -1
- package/dist/core/roadmap-migration.d.ts +2 -1
- package/dist/core/roadmap-migration.d.ts.map +1 -1
- package/dist/core/roadmap-migration.js +110 -51
- package/dist/core/roadmap-migration.js.map +1 -1
- package/dist/core/roadmap-source-patch.d.ts +2 -1
- package/dist/core/roadmap-source-patch.d.ts.map +1 -1
- package/dist/core/roadmap-source-patch.js +9 -4
- package/dist/core/roadmap-source-patch.js.map +1 -1
- package/dist/core/roadmap-sources.d.ts +2 -1
- package/dist/core/roadmap-sources.d.ts.map +1 -1
- package/dist/core/roadmap-sources.js +38 -26
- package/dist/core/roadmap-sources.js.map +1 -1
- package/dist/core/roadmap.d.ts +22 -16
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +152 -84
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/session-branch.d.ts +17 -0
- package/dist/core/session-branch.d.ts.map +1 -0
- package/dist/core/session-branch.js +85 -0
- package/dist/core/session-branch.js.map +1 -0
- package/dist/core/sprint-id.d.ts +13 -5
- package/dist/core/sprint-id.d.ts.map +1 -1
- package/dist/core/sprint-id.js +16 -0
- package/dist/core/sprint-id.js.map +1 -1
- package/dist/core/standup.d.ts +2 -1
- package/dist/core/standup.d.ts.map +1 -1
- package/dist/core/standup.js.map +1 -1
- package/dist/core/store.d.ts +16 -8
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +34 -0
- package/dist/core/store.js.map +1 -1
- package/dist/core/tournament.d.ts.map +1 -1
- package/dist/core/tournament.js +4 -3
- package/dist/core/tournament.js.map +1 -1
- package/dist/core/types.d.ts +9 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/validation.d.ts +2 -1
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +2 -1
- package/dist/core/validation.js.map +1 -1
- package/dist/core/webhooks.d.ts +3 -2
- package/dist/core/webhooks.d.ts.map +1 -1
- package/dist/core/webhooks.js +9 -2
- package/dist/core/webhooks.js.map +1 -1
- package/dist/core/workflow-loader.d.ts.map +1 -1
- package/dist/core/workflow-loader.js +2 -1
- package/dist/core/workflow-loader.js.map +1 -1
- package/dist/mcp/index.d.ts +5 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +97 -59
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/index.test.js +14 -3
- package/dist/mcp/index.test.js.map +1 -1
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +36 -28
- package/dist/mcp/registry.js.map +1 -1
- package/dist/store/index.d.ts +13 -11
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +217 -36
- package/dist/store/index.js.map +1 -1
- package/dist/store-pg/index.d.ts +18 -12
- package/dist/store-pg/index.d.ts.map +1 -1
- package/dist/store-pg/index.js +124 -38
- package/dist/store-pg/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/roadmap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/roadmap.ts"],"names":[],"mappings":"AA4wCA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFlE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
2
|
import { dirname, join, relative, resolve } from 'node:path';
|
|
3
|
-
import { parseRoadmap, validateRoadmap, castRoadmapStructure, findShippedSprintsOnMain,
|
|
3
|
+
import { parseRoadmap, validateRoadmap, castRoadmapStructure, findShippedSprintsOnMain, computeCriticalPath, findParallelOpportunities, findRoadmapSprint, formatRoadmapSummary, formatStrategicContext, buildRoadmapFocus, formatRoadmapFocus, formatRoadmapSprintLabel, roadmapSprintKey, roadmapSprintKeyFromId, compareRoadmapSprintIds, isRoadmapSprintPending, loadScorecards, discoverScorecardFiles, sprintNumberFromScorecardFile, sprintIdKey, latestSprintIdKey, nextCanonicalSprintId, loadVision, analyzeBacklog, mergeBacklogs, runAnalyzers, estimateComplexity, generateRoadmapFromVision, RoadmapGenerationError, normalizeDiagnosticPath, } from '../../core/index.js';
|
|
4
4
|
import { loadConfig } from '../config.js';
|
|
5
5
|
import { buildRoadmapReality, formatRoadmapRealitySection, roadmapRealityIssues } from '../pre-sprint-reality.js';
|
|
6
6
|
import { interviewCommand } from './interview.js';
|
|
@@ -23,20 +23,26 @@ const DEFAULT_UPCOMING_LIMIT = 3;
|
|
|
23
23
|
function getRoadmapStatus(sprint) {
|
|
24
24
|
return sprint.status;
|
|
25
25
|
}
|
|
26
|
-
function isTerminalRoadmapSprint(sprint, completedSprints) {
|
|
27
|
-
return completedSprints.has(
|
|
26
|
+
function isTerminalRoadmapSprint(roadmap, sprint, completedSprints) {
|
|
27
|
+
return completedSprints.has(roadmapSprintKey(roadmap, sprint))
|
|
28
|
+
|| TERMINAL_ROADMAP_STATUSES.has(getRoadmapStatus(sprint) ?? '');
|
|
28
29
|
}
|
|
29
30
|
function blockedByForSprint(roadmap, sprint, completedSprints) {
|
|
30
31
|
return (sprint.depends_on ?? []).filter(dep => {
|
|
31
|
-
const dependency = roadmap
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const dependency = findRoadmapSprint(roadmap, dep);
|
|
33
|
+
const key = roadmapSprintKeyFromId(roadmap, dep);
|
|
34
|
+
return dependency
|
|
35
|
+
? !isTerminalRoadmapSprint(roadmap, dependency, completedSprints)
|
|
36
|
+
: key === null || !completedSprints.has(key);
|
|
37
|
+
}).map(dep => roadmapSprintKeyFromId(roadmap, dep) ?? String(dep));
|
|
34
38
|
}
|
|
35
39
|
function statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints) {
|
|
36
40
|
const explicitStatus = getRoadmapStatus(sprint);
|
|
37
|
-
const isCompleted = completedSprints.has(sprint
|
|
41
|
+
const isCompleted = completedSprints.has(roadmapSprintKey(roadmap, sprint))
|
|
42
|
+
|| explicitStatus === 'complete';
|
|
38
43
|
const isSuperseded = explicitStatus === 'superseded';
|
|
39
|
-
const isCurrent = sprint
|
|
44
|
+
const isCurrent = roadmapSprintKey(roadmap, sprint)
|
|
45
|
+
=== roadmapSprintKeyFromId(roadmap, currentSprint);
|
|
40
46
|
const blockedBy = blockedByForSprint(roadmap, sprint, completedSprints);
|
|
41
47
|
if (isSuperseded)
|
|
42
48
|
return '\u21B7 superseded';
|
|
@@ -49,15 +55,21 @@ function statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints)
|
|
|
49
55
|
return '\u25CB pending';
|
|
50
56
|
}
|
|
51
57
|
function phaseForSprint(roadmap, sprintId) {
|
|
52
|
-
|
|
58
|
+
const key = roadmapSprintKeyFromId(roadmap, sprintId);
|
|
59
|
+
return roadmap.phases.find(phase => {
|
|
60
|
+
const ids = phase.sprint_keys ?? phase.sprints.map(String);
|
|
61
|
+
return ids.some(id => roadmapSprintKeyFromId(roadmap, id) === key);
|
|
62
|
+
});
|
|
53
63
|
}
|
|
54
64
|
function formatPhaseProgress(roadmap, phase, completedSprints) {
|
|
55
|
-
const
|
|
56
|
-
|
|
65
|
+
const phaseKeys = new Set((phase.sprint_keys ?? phase.sprints.map(String))
|
|
66
|
+
.map(id => roadmapSprintKeyFromId(roadmap, id)));
|
|
67
|
+
const phaseSprints = roadmap.sprints.filter(sprint => phaseKeys.has(roadmapSprintKey(roadmap, sprint)));
|
|
68
|
+
const completed = phaseSprints.filter(sprint => isTerminalRoadmapSprint(roadmap, sprint, completedSprints)).length;
|
|
57
69
|
return `${phase.name || 'Unnamed Phase'} (${completed}/${phaseSprints.length})`;
|
|
58
70
|
}
|
|
59
71
|
function sortedRoadmapSprints(roadmap) {
|
|
60
|
-
return [...roadmap.sprints].sort((a, b) =>
|
|
72
|
+
return [...roadmap.sprints].sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b)));
|
|
61
73
|
}
|
|
62
74
|
function resolveRoadmapPath(flags, cwd) {
|
|
63
75
|
if (flags.path)
|
|
@@ -104,35 +116,36 @@ function loadRoadmapFile(flags, cwd) {
|
|
|
104
116
|
}
|
|
105
117
|
function resolveSprint(flags, cwd, roadmap, scorecards = []) {
|
|
106
118
|
if (flags.sprint) {
|
|
107
|
-
const parsed =
|
|
119
|
+
const parsed = sprintIdKey(flags.sprint);
|
|
108
120
|
if (parsed == null) {
|
|
109
121
|
console.error(`\nInvalid sprint number: ${flags.sprint}\n`);
|
|
110
122
|
process.exit(1);
|
|
111
123
|
}
|
|
112
|
-
return parsed;
|
|
124
|
+
return roadmap ? roadmapSprintKeyFromId(roadmap, parsed) ?? parsed : parsed;
|
|
113
125
|
}
|
|
114
|
-
const completedSprints = new Set(scorecards
|
|
126
|
+
const completedSprints = new Set(scorecards
|
|
127
|
+
.map(s => roadmap ? roadmapSprintKeyFromId(roadmap, s.sprint_number) : String(s.sprint_number))
|
|
128
|
+
.filter((key) => key !== null));
|
|
115
129
|
const roadmapCurrent = resolveRoadmapCurrentSprint(roadmap, completedSprints);
|
|
116
130
|
if (roadmapCurrent != null)
|
|
117
131
|
return roadmapCurrent;
|
|
118
132
|
const config = loadConfig(cwd);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
return 1;
|
|
126
|
-
return Math.max(...sprintNumbers) + 1;
|
|
133
|
+
const configured = config.currentSprint == null ? null : sprintIdKey(config.currentSprint);
|
|
134
|
+
if (configured != null) {
|
|
135
|
+
return roadmap ? roadmapSprintKeyFromId(roadmap, configured) ?? configured : configured;
|
|
136
|
+
}
|
|
137
|
+
const latest = latestSprintIdKey(scorecards.map(s => s.sprint_number), '');
|
|
138
|
+
return latest ? nextCanonicalSprintId(latest) : '1';
|
|
127
139
|
}
|
|
128
140
|
function resolveRoadmapCurrentSprint(roadmap, completedSprints) {
|
|
129
141
|
const candidates = roadmap?.sprints
|
|
130
|
-
.filter(sprint => isRoadmapSprintPending(sprint)
|
|
131
|
-
.
|
|
142
|
+
.filter(sprint => isRoadmapSprintPending(sprint)
|
|
143
|
+
&& !completedSprints.has(roadmapSprintKey(roadmap, sprint)))
|
|
144
|
+
.sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b))) ?? [];
|
|
132
145
|
if (candidates.length === 0)
|
|
133
146
|
return null;
|
|
134
147
|
const active = candidates.find(sprint => getRoadmapStatus(sprint) === 'active');
|
|
135
|
-
return (active ?? candidates[0])
|
|
148
|
+
return roadmapSprintKey(roadmap, active ?? candidates[0]);
|
|
136
149
|
}
|
|
137
150
|
// --- Subcommands ---
|
|
138
151
|
function validateSubcommand(flags, cwd) {
|
|
@@ -221,11 +234,12 @@ function reviewSubcommand(flags, cwd) {
|
|
|
221
234
|
// Flag outliers
|
|
222
235
|
for (const sprint of roadmap.sprints) {
|
|
223
236
|
const ticketCount = sprint.tickets?.length ?? 0;
|
|
237
|
+
const sprintLabel = formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint));
|
|
224
238
|
if (ticketCount > 4) {
|
|
225
|
-
console.log(` \u26A0
|
|
239
|
+
console.log(` \u26A0 ${sprintLabel} has ${ticketCount} tickets (over recommended 4)`);
|
|
226
240
|
}
|
|
227
241
|
if (ticketCount < 3) {
|
|
228
|
-
console.log(` \u26A0
|
|
242
|
+
console.log(` \u26A0 ${sprintLabel} has ${ticketCount} tickets (under recommended 3)`);
|
|
229
243
|
}
|
|
230
244
|
}
|
|
231
245
|
// Club distribution
|
|
@@ -250,9 +264,9 @@ function reviewSubcommand(flags, cwd) {
|
|
|
250
264
|
// Identify bottlenecks (sprints on critical path with many dependents)
|
|
251
265
|
const criticalSet = new Set(criticalPath.path);
|
|
252
266
|
for (const id of criticalPath.path) {
|
|
253
|
-
const dependents = roadmap.sprints.filter(s => s.depends_on?.
|
|
267
|
+
const dependents = roadmap.sprints.filter(s => s.depends_on?.some(dep => roadmapSprintKeyFromId(roadmap, dep) === id));
|
|
254
268
|
if (dependents.length > 1) {
|
|
255
|
-
console.log(` \u26A0
|
|
269
|
+
console.log(` \u26A0 ${formatRoadmapSprintLabel(roadmap, id)} is a bottleneck — ${dependents.length} sprints depend on it`);
|
|
256
270
|
}
|
|
257
271
|
}
|
|
258
272
|
// 4. Parallel opportunities
|
|
@@ -271,9 +285,10 @@ function reviewSubcommand(flags, cwd) {
|
|
|
271
285
|
console.log('\n## Dependency Analysis');
|
|
272
286
|
for (const sprint of roadmap.sprints) {
|
|
273
287
|
const fanIn = sprint.depends_on?.length ?? 0;
|
|
274
|
-
const
|
|
288
|
+
const sprintKey = roadmapSprintKey(roadmap, sprint);
|
|
289
|
+
const fanOut = roadmap.sprints.filter(s => s.depends_on?.some(dep => roadmapSprintKeyFromId(roadmap, dep) === sprintKey)).length;
|
|
275
290
|
if (fanIn > 2 || fanOut > 2) {
|
|
276
|
-
console.log(`
|
|
291
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, sprintKey)}: fan-in=${fanIn} fan-out=${fanOut}${fanIn > 2 ? ' (high fan-in)' : ''}${fanOut > 2 ? ' (high fan-out)' : ''}`);
|
|
277
292
|
}
|
|
278
293
|
}
|
|
279
294
|
// Summary verdict
|
|
@@ -296,7 +311,9 @@ function statusSubcommand(flags, cwd) {
|
|
|
296
311
|
const config = loadConfig(cwd);
|
|
297
312
|
const scorecards = loadScorecards(config, cwd);
|
|
298
313
|
const currentSprint = resolveSprint(flags, cwd, roadmap, scorecards);
|
|
299
|
-
const completedSprints = new Set(scorecards
|
|
314
|
+
const completedSprints = new Set(scorecards
|
|
315
|
+
.map(s => roadmapSprintKeyFromId(roadmap, s.sprint_number))
|
|
316
|
+
.filter((key) => key !== null));
|
|
300
317
|
if (flags.full === 'true' || flags.history === 'true') {
|
|
301
318
|
printFullRoadmapStatus(roadmap, currentSprint, completedSprints);
|
|
302
319
|
}
|
|
@@ -317,37 +334,39 @@ function displayPath(cwd, path) {
|
|
|
317
334
|
* and mark the projection as generated and read-only (GH #636).
|
|
318
335
|
*/
|
|
319
336
|
function roadmapSourceEvidence(cwd, flags, sprintId) {
|
|
337
|
+
const inputKey = sprintIdKey(sprintId) ?? String(sprintId);
|
|
320
338
|
const projection = {
|
|
321
339
|
kind: 'roadmap',
|
|
322
340
|
label: 'Roadmap source',
|
|
323
341
|
ref: displayPath(cwd, resolveRoadmapPath(flags, cwd)),
|
|
324
|
-
sprint:
|
|
342
|
+
sprint: inputKey,
|
|
325
343
|
};
|
|
326
344
|
// An explicit --path overrides federation: report exactly what was read.
|
|
327
345
|
if (flags.path || !hasModularRoadmapSources(cwd))
|
|
328
346
|
return [projection];
|
|
329
347
|
try {
|
|
330
348
|
const store = loadRoadmapSourceStore(cwd);
|
|
331
|
-
const
|
|
349
|
+
const canonicalKey = roadmapSprintKeyFromId(store.roadmap, sprintId) ?? inputKey;
|
|
350
|
+
const owner = store.sources.find(source => source.document.sprints.some(sprint => roadmapSprintKey(store.roadmap, sprint) === canonicalKey));
|
|
332
351
|
const evidence = [{
|
|
333
352
|
kind: 'roadmap',
|
|
334
353
|
label: 'Roadmap source (canonical manifest)',
|
|
335
354
|
ref: displayPath(cwd, store.manifestPath),
|
|
336
|
-
sprint:
|
|
355
|
+
sprint: canonicalKey,
|
|
337
356
|
}];
|
|
338
357
|
if (owner?.absolutePath) {
|
|
339
358
|
evidence.push({
|
|
340
359
|
kind: 'roadmap',
|
|
341
360
|
label: `Owning source bundle (${owner.entry.kind})`,
|
|
342
361
|
ref: displayPath(cwd, owner.absolutePath),
|
|
343
|
-
sprint:
|
|
362
|
+
sprint: canonicalKey,
|
|
344
363
|
});
|
|
345
364
|
}
|
|
346
365
|
evidence.push({
|
|
347
366
|
kind: 'roadmap',
|
|
348
367
|
label: 'Compatibility projection (generated, read-only)',
|
|
349
368
|
ref: displayPath(cwd, store.outputPath),
|
|
350
|
-
sprint:
|
|
369
|
+
sprint: canonicalKey,
|
|
351
370
|
});
|
|
352
371
|
return evidence;
|
|
353
372
|
}
|
|
@@ -359,21 +378,31 @@ function roadmapSourceEvidence(cwd, flags, sprintId) {
|
|
|
359
378
|
function focusEvidence(roadmap, sprintId, flags, cwd) {
|
|
360
379
|
const config = loadConfig(cwd);
|
|
361
380
|
const evidence = roadmapSourceEvidence(cwd, flags, sprintId);
|
|
362
|
-
const selected = roadmap
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
const
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
381
|
+
const selected = findRoadmapSprint(roadmap, sprintId);
|
|
382
|
+
if (!selected)
|
|
383
|
+
return evidence;
|
|
384
|
+
const selectedKey = roadmapSprintKey(roadmap, selected);
|
|
385
|
+
const phase = roadmap.phases.find(candidate => {
|
|
386
|
+
const keys = candidate.sprint_keys ?? candidate.sprints;
|
|
387
|
+
return keys.some(id => roadmapSprintKeyFromId(roadmap, id) === selectedKey);
|
|
388
|
+
});
|
|
389
|
+
const phaseKeys = (phase?.sprint_keys ?? phase?.sprints ?? [])
|
|
390
|
+
.map(id => roadmapSprintKeyFromId(roadmap, id))
|
|
391
|
+
.filter((id) => id !== null);
|
|
392
|
+
const phaseIndex = phaseKeys.indexOf(selectedKey);
|
|
393
|
+
const contextKeys = new Set([
|
|
394
|
+
selectedKey,
|
|
395
|
+
...(selected.depends_on ?? [])
|
|
396
|
+
.map(id => roadmapSprintKeyFromId(roadmap, id))
|
|
397
|
+
.filter((id) => id !== null),
|
|
398
|
+
...(phaseIndex < 0 ? [] : phaseKeys.slice(Math.max(0, phaseIndex - 2), phaseIndex)),
|
|
369
399
|
]);
|
|
370
|
-
const contextByValue = new Map([...contextIds].map(id => [roadmapSprintOrderValue(roadmap, id), id]));
|
|
371
400
|
for (const path of discoverScorecardFiles(config, cwd)) {
|
|
372
401
|
const scorecardSprint = sprintNumberFromScorecardFile(path, config);
|
|
373
402
|
if (scorecardSprint == null)
|
|
374
403
|
continue;
|
|
375
|
-
const roadmapSprintId =
|
|
376
|
-
if (roadmapSprintId == null)
|
|
404
|
+
const roadmapSprintId = roadmapSprintKeyFromId(roadmap, scorecardSprint);
|
|
405
|
+
if (roadmapSprintId == null || !contextKeys.has(roadmapSprintId))
|
|
377
406
|
continue;
|
|
378
407
|
evidence.push({
|
|
379
408
|
kind: 'scorecard',
|
|
@@ -402,7 +431,7 @@ function focusSubcommand(flags, cwd) {
|
|
|
402
431
|
process.exit(1);
|
|
403
432
|
return;
|
|
404
433
|
}
|
|
405
|
-
const sprintId =
|
|
434
|
+
const sprintId = sprintIdKey(flags.sprint);
|
|
406
435
|
if (sprintId == null) {
|
|
407
436
|
console.error(`\nInvalid sprint number: ${flags.sprint || '(empty)'}`);
|
|
408
437
|
console.error('Usage: slope roadmap focus --sprint=N [--path=<file>] [--json]\n');
|
|
@@ -414,25 +443,32 @@ function focusSubcommand(flags, cwd) {
|
|
|
414
443
|
process.exit(1);
|
|
415
444
|
return;
|
|
416
445
|
}
|
|
446
|
+
const selected = findRoadmapSprint(roadmap, sprintId);
|
|
447
|
+
if (!selected) {
|
|
448
|
+
console.error(`\nSprint ${formatRoadmapSprintLabel(roadmap, sprintId)} was not found in the roadmap.\n`);
|
|
449
|
+
process.exit(1);
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
const selectedKey = roadmapSprintKey(roadmap, selected);
|
|
417
453
|
const config = loadConfig(cwd);
|
|
418
454
|
const scorecards = loadScorecards(config, cwd);
|
|
419
455
|
const completedSprintIds = scorecards.map(card => card.sprint_number);
|
|
420
|
-
const hazards = roadmapRealityIssues(buildRoadmapReality(cwd, roadmap),
|
|
456
|
+
const hazards = roadmapRealityIssues(buildRoadmapReality(cwd, roadmap), selectedKey)
|
|
421
457
|
.map(issue => ({
|
|
422
|
-
sprint:
|
|
423
|
-
sprint_label: formatRoadmapSprintLabel(roadmap,
|
|
458
|
+
sprint: selectedKey,
|
|
459
|
+
sprint_label: formatRoadmapSprintLabel(roadmap, selectedKey),
|
|
424
460
|
type: 'roadmap_reality',
|
|
425
461
|
severity: issue.type === 'error' ? 'major' : 'minor',
|
|
426
462
|
description: issue.message,
|
|
427
463
|
}));
|
|
428
|
-
const focus = buildRoadmapFocus(roadmap,
|
|
464
|
+
const focus = buildRoadmapFocus(roadmap, selectedKey, {
|
|
429
465
|
completedSprintIds,
|
|
430
466
|
hazards,
|
|
431
467
|
scorecards,
|
|
432
|
-
evidence: focusEvidence(roadmap,
|
|
468
|
+
evidence: focusEvidence(roadmap, selectedKey, flags, cwd),
|
|
433
469
|
});
|
|
434
470
|
if (!focus) {
|
|
435
|
-
console.error(`\nSprint ${formatRoadmapSprintLabel(roadmap,
|
|
471
|
+
console.error(`\nSprint ${formatRoadmapSprintLabel(roadmap, selectedKey)} was not found in the roadmap.\n`);
|
|
436
472
|
process.exit(1);
|
|
437
473
|
return;
|
|
438
474
|
}
|
|
@@ -485,7 +521,7 @@ function completeSourcesSubcommand(flags, cwd) {
|
|
|
485
521
|
process.exit(1);
|
|
486
522
|
return;
|
|
487
523
|
}
|
|
488
|
-
const sprint =
|
|
524
|
+
const sprint = sprintIdKey(flags.sprint);
|
|
489
525
|
if (sprint == null) {
|
|
490
526
|
console.error(`\nInvalid sprint number: ${flags.sprint || '(empty)'}`);
|
|
491
527
|
console.error('Usage: slope roadmap complete --sprint=N [--source=<file>] [--scorecard=<path>] [--dry-run]\n');
|
|
@@ -510,7 +546,7 @@ function completeSourcesSubcommand(flags, cwd) {
|
|
|
510
546
|
dryRun: flags['dry-run'] === 'true',
|
|
511
547
|
force: true,
|
|
512
548
|
});
|
|
513
|
-
const label = `S${
|
|
549
|
+
const label = `S${sprint}`;
|
|
514
550
|
if (flags['dry-run'] === 'true') {
|
|
515
551
|
console.log(`\nRoadmap complete dry run: ${label} in ${result.source}`);
|
|
516
552
|
console.log(` Would change source: ${result.changed ? 'yes' : 'no'}`);
|
|
@@ -671,14 +707,16 @@ function archiveSourcesSubcommand(flags, cwd) {
|
|
|
671
707
|
process.exit(1);
|
|
672
708
|
return;
|
|
673
709
|
}
|
|
674
|
-
const
|
|
675
|
-
if (
|
|
710
|
+
const requestedThrough = sprintIdKey(flags.through);
|
|
711
|
+
if (requestedThrough == null) {
|
|
676
712
|
console.error(`\nInvalid archive boundary: ${flags.through || '(empty)'}\n`);
|
|
677
713
|
process.exit(1);
|
|
678
714
|
return;
|
|
679
715
|
}
|
|
680
716
|
try {
|
|
681
717
|
const store = loadRoadmapSourceStore(cwd, flags.source);
|
|
718
|
+
const through = roadmapSprintKeyFromId(store.roadmap, requestedThrough) ?? requestedThrough;
|
|
719
|
+
assertCanonicalArchiveBoundary(store, through);
|
|
682
720
|
const projectionBefore = existsSync(store.outputPath) ? readFileSync(store.outputPath, 'utf8') : null;
|
|
683
721
|
const plan = planRoadmapSourceArchive(store, through);
|
|
684
722
|
console.log(`\nRoadmap archive through Sprint ${through}:`);
|
|
@@ -705,6 +743,19 @@ function archiveSourcesSubcommand(flags, cwd) {
|
|
|
705
743
|
process.exit(1);
|
|
706
744
|
}
|
|
707
745
|
}
|
|
746
|
+
function assertCanonicalArchiveBoundary(store, through) {
|
|
747
|
+
for (const source of store.sources) {
|
|
748
|
+
if (source.entry.kind !== 'phase')
|
|
749
|
+
continue;
|
|
750
|
+
const sprintIds = source.document.phase.sprint_keys
|
|
751
|
+
?? source.document.phase.sprints;
|
|
752
|
+
const comparisons = sprintIds
|
|
753
|
+
.map(id => compareRoadmapSprintIds(store.roadmap, id, through));
|
|
754
|
+
if (comparisons.some(value => value <= 0) && comparisons.some(value => value > 0)) {
|
|
755
|
+
throw new Error(`--through would split phase "${source.document.phase.name}"; archive whole phases only`);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
708
759
|
function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
709
760
|
console.log(`\n# Roadmap Status — ${roadmap.name}`);
|
|
710
761
|
console.log('\u2550'.repeat(40));
|
|
@@ -717,18 +768,25 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
|
717
768
|
console.log('');
|
|
718
769
|
continue;
|
|
719
770
|
}
|
|
720
|
-
const
|
|
721
|
-
|
|
771
|
+
const phaseKeys = new Set((phase.sprint_keys ?? phase.sprints.map(String))
|
|
772
|
+
.map(id => roadmapSprintKeyFromId(roadmap, id)));
|
|
773
|
+
const phaseSprints = roadmap.sprints.filter(sprint => phaseKeys.has(roadmapSprintKey(roadmap, sprint)));
|
|
774
|
+
const completed = phaseSprints.filter(sprint => isTerminalRoadmapSprint(roadmap, sprint, completedSprints)).length;
|
|
722
775
|
console.log(`## ${phase.name || 'Unnamed Phase'} (${completed}/${phaseSprints.length})`);
|
|
723
776
|
for (const sprint of phaseSprints) {
|
|
724
777
|
const explicitStatus = getRoadmapStatus(sprint);
|
|
725
|
-
const isCompleted = completedSprints.has(sprint
|
|
778
|
+
const isCompleted = completedSprints.has(roadmapSprintKey(roadmap, sprint))
|
|
779
|
+
|| explicitStatus === 'complete';
|
|
726
780
|
const isSuperseded = explicitStatus === 'superseded';
|
|
727
|
-
const isCurrent = sprint
|
|
781
|
+
const isCurrent = roadmapSprintKey(roadmap, sprint)
|
|
782
|
+
=== roadmapSprintKeyFromId(roadmap, currentSprint);
|
|
728
783
|
// Check if blocked: all dependencies must be completed
|
|
729
784
|
const blockedBy = (sprint.depends_on ?? []).filter(dep => {
|
|
730
|
-
const dependency = roadmap
|
|
731
|
-
|
|
785
|
+
const dependency = findRoadmapSprint(roadmap, dep);
|
|
786
|
+
const key = roadmapSprintKeyFromId(roadmap, dep);
|
|
787
|
+
return dependency
|
|
788
|
+
? !isTerminalRoadmapSprint(roadmap, dependency, completedSprints)
|
|
789
|
+
: key === null || !completedSprints.has(key);
|
|
732
790
|
});
|
|
733
791
|
const isBlocked = !isCompleted && !isSuperseded && blockedBy.length > 0;
|
|
734
792
|
let status;
|
|
@@ -748,7 +806,7 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
|
748
806
|
status = '\u25CB pending';
|
|
749
807
|
}
|
|
750
808
|
const theme = sprint.theme || 'Untitled Sprint';
|
|
751
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, sprint
|
|
809
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${theme.padEnd(30)} ${status}`);
|
|
752
810
|
}
|
|
753
811
|
console.log('');
|
|
754
812
|
}
|
|
@@ -761,14 +819,16 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
|
761
819
|
}
|
|
762
820
|
}
|
|
763
821
|
function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd) {
|
|
764
|
-
const current = roadmap
|
|
822
|
+
const current = findRoadmapSprint(roadmap, currentSprint);
|
|
765
823
|
const currentLabel = current
|
|
766
|
-
? `${formatRoadmapSprintLabel(roadmap, current
|
|
824
|
+
? `${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'}`
|
|
767
825
|
: `${formatRoadmapSprintLabel(roadmap, currentSprint)} (not found in roadmap)`;
|
|
768
826
|
const currentIsPending = current ? isRoadmapSprintPending(current) : false;
|
|
769
827
|
const currentPhase = phaseForSprint(roadmap, currentSprint);
|
|
770
828
|
const pendingAfterCurrent = sortedRoadmapSprints(roadmap)
|
|
771
|
-
.filter(s => isRoadmapSprintPending(s)
|
|
829
|
+
.filter(s => isRoadmapSprintPending(s)
|
|
830
|
+
&& roadmapSprintKey(roadmap, s) !== roadmapSprintKeyFromId(roadmap, currentSprint)
|
|
831
|
+
&& compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, s), currentSprint) > 0);
|
|
772
832
|
const nextReady = pendingAfterCurrent.find(s => blockedByForSprint(roadmap, s, completedSprints).length === 0);
|
|
773
833
|
const upcoming = pendingAfterCurrent.slice(0, DEFAULT_UPCOMING_LIMIT);
|
|
774
834
|
const realityLines = formatRoadmapRealitySection(buildRoadmapReality(cwd, roadmap), undefined, 5).slice(1);
|
|
@@ -790,10 +850,10 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
790
850
|
console.log(` ${formatRoadmapSprintLabel(roadmap, currentSprint)} is not defined in the roadmap.`);
|
|
791
851
|
}
|
|
792
852
|
else {
|
|
793
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, current
|
|
853
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, current, currentSprint, completedSprints)}`);
|
|
794
854
|
if ((current.depends_on ?? []).length > 0) {
|
|
795
855
|
const deps = current.depends_on.map(dep => {
|
|
796
|
-
const sprint = roadmap
|
|
856
|
+
const sprint = findRoadmapSprint(roadmap, dep);
|
|
797
857
|
if (!sprint)
|
|
798
858
|
return `${formatRoadmapSprintLabel(roadmap, dep)} missing`;
|
|
799
859
|
return `${formatRoadmapSprintLabel(roadmap, dep)} ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints).replace(/^[^\w]+ /, '')}`;
|
|
@@ -806,7 +866,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
806
866
|
}
|
|
807
867
|
console.log('\nNext ready:');
|
|
808
868
|
if (nextReady) {
|
|
809
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, nextReady
|
|
869
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))} ${nextReady.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, nextReady, currentSprint, completedSprints)}`);
|
|
810
870
|
}
|
|
811
871
|
else {
|
|
812
872
|
console.log(' None yet');
|
|
@@ -817,7 +877,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
817
877
|
}
|
|
818
878
|
else {
|
|
819
879
|
for (const sprint of upcoming) {
|
|
820
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, sprint
|
|
880
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${sprint.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints)}`);
|
|
821
881
|
}
|
|
822
882
|
}
|
|
823
883
|
console.log('\nRecommended next action:');
|
|
@@ -829,7 +889,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
829
889
|
console.log(` Work ${first.key}: ${first.title}`);
|
|
830
890
|
}
|
|
831
891
|
else if (nextReady) {
|
|
832
|
-
console.log(` Start ${formatRoadmapSprintLabel(roadmap, nextReady
|
|
892
|
+
console.log(` Start ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))}: ${nextReady.theme || 'Untitled Sprint'}`);
|
|
833
893
|
}
|
|
834
894
|
else {
|
|
835
895
|
console.log(' No roadmap action is currently ready.');
|
|
@@ -865,7 +925,8 @@ function scorecardToSprint(card) {
|
|
|
865
925
|
complexity: CLUB_TO_COMPLEXITY[shot.club] ?? 'standard',
|
|
866
926
|
}));
|
|
867
927
|
return {
|
|
868
|
-
id: card.sprint_number,
|
|
928
|
+
id: Number(card.sprint_number),
|
|
929
|
+
id_key: card.sprint_number,
|
|
869
930
|
theme: card.theme,
|
|
870
931
|
par: card.par,
|
|
871
932
|
slope: card.slope,
|
|
@@ -928,7 +989,7 @@ function syncSubcommand(flags, cwd) {
|
|
|
928
989
|
process.exit(1);
|
|
929
990
|
return; // unreachable but satisfies TS
|
|
930
991
|
}
|
|
931
|
-
const existingById = new Map(roadmap.sprints.map(s => [s
|
|
992
|
+
const existingById = new Map(roadmap.sprints.map(s => [roadmapSprintKey(roadmap, s), s]));
|
|
932
993
|
let updated = 0;
|
|
933
994
|
let added = 0;
|
|
934
995
|
for (const card of scorecards) {
|
|
@@ -952,8 +1013,7 @@ function syncSubcommand(flags, cwd) {
|
|
|
952
1013
|
added++;
|
|
953
1014
|
}
|
|
954
1015
|
}
|
|
955
|
-
|
|
956
|
-
roadmap.sprints.sort((a, b) => a.id - b.id);
|
|
1016
|
+
roadmap.sprints.sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b)));
|
|
957
1017
|
// Build output
|
|
958
1018
|
const output = JSON.stringify(roadmap, null, 2) + '\n';
|
|
959
1019
|
console.log(`\nRoadmap sync: ${path}`);
|