@slope-dev/slope 1.64.0 → 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 +144 -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 +13 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +47 -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 +15 -4
- package/dist/cli/roadmap-source-store.d.ts.map +1 -1
- package/dist/cli/roadmap-source-store.js +79 -33
- 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 +35 -17
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +167 -86
- 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');
|
|
@@ -499,12 +535,18 @@ function completeSourcesSubcommand(flags, cwd) {
|
|
|
499
535
|
.find(file => sprintNumberFromScorecardFile(file, config) === sprint);
|
|
500
536
|
const scorecardPath = scorecard ? displayPath(cwd, scorecard) : undefined;
|
|
501
537
|
try {
|
|
538
|
+
// `slope roadmap complete` is the explicit operator override — the escape
|
|
539
|
+
// hatch validate points at when it refuses to auto-promote a deliberate
|
|
540
|
+
// status (absorbed/blocked/deferred/...). Force the completion so the
|
|
541
|
+
// command still works on those statuses; the automatic validate path stays
|
|
542
|
+
// safe because it does not force (GH #660).
|
|
502
543
|
const result = completeRoadmapSourceSprint(cwd, sprint, {
|
|
503
544
|
sourceFlag: flags.source,
|
|
504
545
|
scorecardPath,
|
|
505
546
|
dryRun: flags['dry-run'] === 'true',
|
|
547
|
+
force: true,
|
|
506
548
|
});
|
|
507
|
-
const label = `S${
|
|
549
|
+
const label = `S${sprint}`;
|
|
508
550
|
if (flags['dry-run'] === 'true') {
|
|
509
551
|
console.log(`\nRoadmap complete dry run: ${label} in ${result.source}`);
|
|
510
552
|
console.log(` Would change source: ${result.changed ? 'yes' : 'no'}`);
|
|
@@ -665,14 +707,16 @@ function archiveSourcesSubcommand(flags, cwd) {
|
|
|
665
707
|
process.exit(1);
|
|
666
708
|
return;
|
|
667
709
|
}
|
|
668
|
-
const
|
|
669
|
-
if (
|
|
710
|
+
const requestedThrough = sprintIdKey(flags.through);
|
|
711
|
+
if (requestedThrough == null) {
|
|
670
712
|
console.error(`\nInvalid archive boundary: ${flags.through || '(empty)'}\n`);
|
|
671
713
|
process.exit(1);
|
|
672
714
|
return;
|
|
673
715
|
}
|
|
674
716
|
try {
|
|
675
717
|
const store = loadRoadmapSourceStore(cwd, flags.source);
|
|
718
|
+
const through = roadmapSprintKeyFromId(store.roadmap, requestedThrough) ?? requestedThrough;
|
|
719
|
+
assertCanonicalArchiveBoundary(store, through);
|
|
676
720
|
const projectionBefore = existsSync(store.outputPath) ? readFileSync(store.outputPath, 'utf8') : null;
|
|
677
721
|
const plan = planRoadmapSourceArchive(store, through);
|
|
678
722
|
console.log(`\nRoadmap archive through Sprint ${through}:`);
|
|
@@ -699,6 +743,19 @@ function archiveSourcesSubcommand(flags, cwd) {
|
|
|
699
743
|
process.exit(1);
|
|
700
744
|
}
|
|
701
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
|
+
}
|
|
702
759
|
function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
703
760
|
console.log(`\n# Roadmap Status — ${roadmap.name}`);
|
|
704
761
|
console.log('\u2550'.repeat(40));
|
|
@@ -711,18 +768,25 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
|
711
768
|
console.log('');
|
|
712
769
|
continue;
|
|
713
770
|
}
|
|
714
|
-
const
|
|
715
|
-
|
|
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;
|
|
716
775
|
console.log(`## ${phase.name || 'Unnamed Phase'} (${completed}/${phaseSprints.length})`);
|
|
717
776
|
for (const sprint of phaseSprints) {
|
|
718
777
|
const explicitStatus = getRoadmapStatus(sprint);
|
|
719
|
-
const isCompleted = completedSprints.has(sprint
|
|
778
|
+
const isCompleted = completedSprints.has(roadmapSprintKey(roadmap, sprint))
|
|
779
|
+
|| explicitStatus === 'complete';
|
|
720
780
|
const isSuperseded = explicitStatus === 'superseded';
|
|
721
|
-
const isCurrent = sprint
|
|
781
|
+
const isCurrent = roadmapSprintKey(roadmap, sprint)
|
|
782
|
+
=== roadmapSprintKeyFromId(roadmap, currentSprint);
|
|
722
783
|
// Check if blocked: all dependencies must be completed
|
|
723
784
|
const blockedBy = (sprint.depends_on ?? []).filter(dep => {
|
|
724
|
-
const dependency = roadmap
|
|
725
|
-
|
|
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);
|
|
726
790
|
});
|
|
727
791
|
const isBlocked = !isCompleted && !isSuperseded && blockedBy.length > 0;
|
|
728
792
|
let status;
|
|
@@ -742,7 +806,7 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
|
742
806
|
status = '\u25CB pending';
|
|
743
807
|
}
|
|
744
808
|
const theme = sprint.theme || 'Untitled Sprint';
|
|
745
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, sprint
|
|
809
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${theme.padEnd(30)} ${status}`);
|
|
746
810
|
}
|
|
747
811
|
console.log('');
|
|
748
812
|
}
|
|
@@ -755,14 +819,16 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
|
|
|
755
819
|
}
|
|
756
820
|
}
|
|
757
821
|
function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd) {
|
|
758
|
-
const current = roadmap
|
|
822
|
+
const current = findRoadmapSprint(roadmap, currentSprint);
|
|
759
823
|
const currentLabel = current
|
|
760
|
-
? `${formatRoadmapSprintLabel(roadmap, current
|
|
824
|
+
? `${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'}`
|
|
761
825
|
: `${formatRoadmapSprintLabel(roadmap, currentSprint)} (not found in roadmap)`;
|
|
762
826
|
const currentIsPending = current ? isRoadmapSprintPending(current) : false;
|
|
763
827
|
const currentPhase = phaseForSprint(roadmap, currentSprint);
|
|
764
828
|
const pendingAfterCurrent = sortedRoadmapSprints(roadmap)
|
|
765
|
-
.filter(s => isRoadmapSprintPending(s)
|
|
829
|
+
.filter(s => isRoadmapSprintPending(s)
|
|
830
|
+
&& roadmapSprintKey(roadmap, s) !== roadmapSprintKeyFromId(roadmap, currentSprint)
|
|
831
|
+
&& compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, s), currentSprint) > 0);
|
|
766
832
|
const nextReady = pendingAfterCurrent.find(s => blockedByForSprint(roadmap, s, completedSprints).length === 0);
|
|
767
833
|
const upcoming = pendingAfterCurrent.slice(0, DEFAULT_UPCOMING_LIMIT);
|
|
768
834
|
const realityLines = formatRoadmapRealitySection(buildRoadmapReality(cwd, roadmap), undefined, 5).slice(1);
|
|
@@ -784,10 +850,10 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
784
850
|
console.log(` ${formatRoadmapSprintLabel(roadmap, currentSprint)} is not defined in the roadmap.`);
|
|
785
851
|
}
|
|
786
852
|
else {
|
|
787
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, current
|
|
853
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, current, currentSprint, completedSprints)}`);
|
|
788
854
|
if ((current.depends_on ?? []).length > 0) {
|
|
789
855
|
const deps = current.depends_on.map(dep => {
|
|
790
|
-
const sprint = roadmap
|
|
856
|
+
const sprint = findRoadmapSprint(roadmap, dep);
|
|
791
857
|
if (!sprint)
|
|
792
858
|
return `${formatRoadmapSprintLabel(roadmap, dep)} missing`;
|
|
793
859
|
return `${formatRoadmapSprintLabel(roadmap, dep)} ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints).replace(/^[^\w]+ /, '')}`;
|
|
@@ -800,7 +866,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
800
866
|
}
|
|
801
867
|
console.log('\nNext ready:');
|
|
802
868
|
if (nextReady) {
|
|
803
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, nextReady
|
|
869
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))} ${nextReady.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, nextReady, currentSprint, completedSprints)}`);
|
|
804
870
|
}
|
|
805
871
|
else {
|
|
806
872
|
console.log(' None yet');
|
|
@@ -811,7 +877,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
811
877
|
}
|
|
812
878
|
else {
|
|
813
879
|
for (const sprint of upcoming) {
|
|
814
|
-
console.log(` ${formatRoadmapSprintLabel(roadmap, sprint
|
|
880
|
+
console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${sprint.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints)}`);
|
|
815
881
|
}
|
|
816
882
|
}
|
|
817
883
|
console.log('\nRecommended next action:');
|
|
@@ -823,7 +889,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
|
|
|
823
889
|
console.log(` Work ${first.key}: ${first.title}`);
|
|
824
890
|
}
|
|
825
891
|
else if (nextReady) {
|
|
826
|
-
console.log(` Start ${formatRoadmapSprintLabel(roadmap, nextReady
|
|
892
|
+
console.log(` Start ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))}: ${nextReady.theme || 'Untitled Sprint'}`);
|
|
827
893
|
}
|
|
828
894
|
else {
|
|
829
895
|
console.log(' No roadmap action is currently ready.');
|
|
@@ -859,7 +925,8 @@ function scorecardToSprint(card) {
|
|
|
859
925
|
complexity: CLUB_TO_COMPLEXITY[shot.club] ?? 'standard',
|
|
860
926
|
}));
|
|
861
927
|
return {
|
|
862
|
-
id: card.sprint_number,
|
|
928
|
+
id: Number(card.sprint_number),
|
|
929
|
+
id_key: card.sprint_number,
|
|
863
930
|
theme: card.theme,
|
|
864
931
|
par: card.par,
|
|
865
932
|
slope: card.slope,
|
|
@@ -922,7 +989,7 @@ function syncSubcommand(flags, cwd) {
|
|
|
922
989
|
process.exit(1);
|
|
923
990
|
return; // unreachable but satisfies TS
|
|
924
991
|
}
|
|
925
|
-
const existingById = new Map(roadmap.sprints.map(s => [s
|
|
992
|
+
const existingById = new Map(roadmap.sprints.map(s => [roadmapSprintKey(roadmap, s), s]));
|
|
926
993
|
let updated = 0;
|
|
927
994
|
let added = 0;
|
|
928
995
|
for (const card of scorecards) {
|
|
@@ -946,8 +1013,7 @@ function syncSubcommand(flags, cwd) {
|
|
|
946
1013
|
added++;
|
|
947
1014
|
}
|
|
948
1015
|
}
|
|
949
|
-
|
|
950
|
-
roadmap.sprints.sort((a, b) => a.id - b.id);
|
|
1016
|
+
roadmap.sprints.sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b)));
|
|
951
1017
|
// Build output
|
|
952
1018
|
const output = JSON.stringify(roadmap, null, 2) + '\n';
|
|
953
1019
|
console.log(`\nRoadmap sync: ${path}`);
|