@slope-dev/slope 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +243 -0
- package/dist/cli/commands/auto-card.d.ts +2 -0
- package/dist/cli/commands/auto-card.d.ts.map +1 -0
- package/dist/cli/commands/auto-card.js +267 -0
- package/dist/cli/commands/auto-card.js.map +1 -0
- package/dist/cli/commands/briefing.d.ts +2 -0
- package/dist/cli/commands/briefing.d.ts.map +1 -0
- package/dist/cli/commands/briefing.js +133 -0
- package/dist/cli/commands/briefing.js.map +1 -0
- package/dist/cli/commands/card.d.ts +2 -0
- package/dist/cli/commands/card.d.ts.map +1 -0
- package/dist/cli/commands/card.js +144 -0
- package/dist/cli/commands/card.js.map +1 -0
- package/dist/cli/commands/claim.d.ts +2 -0
- package/dist/cli/commands/claim.d.ts.map +1 -0
- package/dist/cli/commands/claim.js +99 -0
- package/dist/cli/commands/claim.js.map +1 -0
- package/dist/cli/commands/classify.d.ts +2 -0
- package/dist/cli/commands/classify.d.ts.map +1 -0
- package/dist/cli/commands/classify.js +70 -0
- package/dist/cli/commands/classify.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +4 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +156 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/distill.d.ts +2 -0
- package/dist/cli/commands/distill.d.ts.map +1 -0
- package/dist/cli/commands/distill.js +91 -0
- package/dist/cli/commands/distill.js.map +1 -0
- package/dist/cli/commands/escalate.d.ts +2 -0
- package/dist/cli/commands/escalate.d.ts.map +1 -0
- package/dist/cli/commands/escalate.js +136 -0
- package/dist/cli/commands/escalate.js.map +1 -0
- package/dist/cli/commands/extract.d.ts +2 -0
- package/dist/cli/commands/extract.d.ts.map +1 -0
- package/dist/cli/commands/extract.js +147 -0
- package/dist/cli/commands/extract.js.map +1 -0
- package/dist/cli/commands/flows.d.ts +2 -0
- package/dist/cli/commands/flows.d.ts.map +1 -0
- package/dist/cli/commands/flows.js +156 -0
- package/dist/cli/commands/flows.js.map +1 -0
- package/dist/cli/commands/guard.d.ts +15 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +207 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/hook.d.ts +2 -0
- package/dist/cli/commands/hook.d.ts.map +1 -0
- package/dist/cli/commands/hook.js +299 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +421 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/map.d.ts +10 -0
- package/dist/cli/commands/map.d.ts.map +1 -0
- package/dist/cli/commands/map.js +591 -0
- package/dist/cli/commands/map.js.map +1 -0
- package/dist/cli/commands/next.d.ts +2 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +28 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +54 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +2 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +118 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/release.d.ts +2 -0
- package/dist/cli/commands/release.d.ts.map +1 -0
- package/dist/cli/commands/release.js +64 -0
- package/dist/cli/commands/release.js.map +1 -0
- package/dist/cli/commands/report.d.ts +2 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +68 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/review-state.d.ts +11 -0
- package/dist/cli/commands/review-state.d.ts.map +1 -0
- package/dist/cli/commands/review-state.js +193 -0
- package/dist/cli/commands/review-state.js.map +1 -0
- package/dist/cli/commands/review.d.ts +2 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +53 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/roadmap.d.ts +2 -0
- package/dist/cli/commands/roadmap.d.ts.map +1 -0
- package/dist/cli/commands/roadmap.js +283 -0
- package/dist/cli/commands/roadmap.js.map +1 -0
- package/dist/cli/commands/session.d.ts +2 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +232 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/standup.d.ts +2 -0
- package/dist/cli/commands/standup.d.ts.map +1 -0
- package/dist/cli/commands/standup.js +117 -0
- package/dist/cli/commands/standup.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +148 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/tournament.d.ts +2 -0
- package/dist/cli/commands/tournament.d.ts.map +1 -0
- package/dist/cli/commands/tournament.js +60 -0
- package/dist/cli/commands/tournament.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +2 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +74 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +2 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/guards/commit-nudge.d.ts +7 -0
- package/dist/cli/guards/commit-nudge.d.ts.map +1 -0
- package/dist/cli/guards/commit-nudge.js +50 -0
- package/dist/cli/guards/commit-nudge.js.map +1 -0
- package/dist/cli/guards/compaction.d.ts +8 -0
- package/dist/cli/guards/compaction.d.ts.map +1 -0
- package/dist/cli/guards/compaction.js +79 -0
- package/dist/cli/guards/compaction.js.map +1 -0
- package/dist/cli/guards/explore.d.ts +8 -0
- package/dist/cli/guards/explore.d.ts.map +1 -0
- package/dist/cli/guards/explore.js +78 -0
- package/dist/cli/guards/explore.js.map +1 -0
- package/dist/cli/guards/hazard.d.ts +7 -0
- package/dist/cli/guards/hazard.d.ts.map +1 -0
- package/dist/cli/guards/hazard.js +43 -0
- package/dist/cli/guards/hazard.js.map +1 -0
- package/dist/cli/guards/next-action.d.ts +28 -0
- package/dist/cli/guards/next-action.d.ts.map +1 -0
- package/dist/cli/guards/next-action.js +196 -0
- package/dist/cli/guards/next-action.js.map +1 -0
- package/dist/cli/guards/push-nudge.d.ts +7 -0
- package/dist/cli/guards/push-nudge.d.ts.map +1 -0
- package/dist/cli/guards/push-nudge.js +53 -0
- package/dist/cli/guards/push-nudge.js.map +1 -0
- package/dist/cli/guards/review-tier.d.ts +7 -0
- package/dist/cli/guards/review-tier.d.ts.map +1 -0
- package/dist/cli/guards/review-tier.js +108 -0
- package/dist/cli/guards/review-tier.js.map +1 -0
- package/dist/cli/guards/scope-drift.d.ts +7 -0
- package/dist/cli/guards/scope-drift.d.ts.map +1 -0
- package/dist/cli/guards/scope-drift.js +47 -0
- package/dist/cli/guards/scope-drift.js.map +1 -0
- package/dist/cli/guards/stop-check.d.ts +7 -0
- package/dist/cli/guards/stop-check.d.ts.map +1 -0
- package/dist/cli/guards/stop-check.js +34 -0
- package/dist/cli/guards/stop-check.js.map +1 -0
- package/dist/cli/guards/subagent-gate.d.ts +7 -0
- package/dist/cli/guards/subagent-gate.d.ts.map +1 -0
- package/dist/cli/guards/subagent-gate.js +39 -0
- package/dist/cli/guards/subagent-gate.js.map +1 -0
- package/dist/cli/guards/version-check.d.ts +8 -0
- package/dist/cli/guards/version-check.d.ts.map +1 -0
- package/dist/cli/guards/version-check.js +49 -0
- package/dist/cli/guards/version-check.js.map +1 -0
- package/dist/cli/guards/workflow-gate.d.ts +7 -0
- package/dist/cli/guards/workflow-gate.d.ts.map +1 -0
- package/dist/cli/guards/workflow-gate.js +31 -0
- package/dist/cli/guards/workflow-gate.js.map +1 -0
- package/dist/cli/hooks-config.d.ts +9 -0
- package/dist/cli/hooks-config.d.ts.map +1 -0
- package/dist/cli/hooks-config.js +21 -0
- package/dist/cli/hooks-config.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +282 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/loader.d.ts +2 -0
- package/dist/cli/loader.d.ts.map +1 -0
- package/dist/cli/loader.js +2 -0
- package/dist/cli/loader.js.map +1 -0
- package/dist/cli/metaphor.d.ts +6 -0
- package/dist/cli/metaphor.d.ts.map +1 -0
- package/dist/cli/metaphor.js +26 -0
- package/dist/cli/metaphor.js.map +1 -0
- package/dist/cli/registries/api-registry.d.ts +11 -0
- package/dist/cli/registries/api-registry.d.ts.map +1 -0
- package/dist/cli/registries/api-registry.js +42 -0
- package/dist/cli/registries/api-registry.js.map +1 -0
- package/dist/cli/registries/file-registry.d.ts +13 -0
- package/dist/cli/registries/file-registry.d.ts.map +1 -0
- package/dist/cli/registries/file-registry.js +55 -0
- package/dist/cli/registries/file-registry.js.map +1 -0
- package/dist/cli/registries/index.d.ts +7 -0
- package/dist/cli/registries/index.d.ts.map +1 -0
- package/dist/cli/registries/index.js +20 -0
- package/dist/cli/registries/index.js.map +1 -0
- package/dist/cli/store.d.ts +3 -0
- package/dist/cli/store.d.ts.map +1 -0
- package/dist/cli/store.js +13 -0
- package/dist/cli/store.js.map +1 -0
- package/dist/cli/template-generator.d.ts +15 -0
- package/dist/cli/template-generator.d.ts.map +1 -0
- package/dist/cli/template-generator.js +562 -0
- package/dist/cli/template-generator.js.map +1 -0
- package/dist/core/advisor.d.ts +63 -0
- package/dist/core/advisor.d.ts.map +1 -0
- package/dist/core/advisor.js +395 -0
- package/dist/core/advisor.js.map +1 -0
- package/dist/core/briefing.d.ts +103 -0
- package/dist/core/briefing.d.ts.map +1 -0
- package/dist/core/briefing.js +380 -0
- package/dist/core/briefing.js.map +1 -0
- package/dist/core/builder.d.ts +70 -0
- package/dist/core/builder.d.ts.map +1 -0
- package/dist/core/builder.js +175 -0
- package/dist/core/builder.js.map +1 -0
- package/dist/core/ci-signals.d.ts +10 -0
- package/dist/core/ci-signals.d.ts.map +1 -0
- package/dist/core/ci-signals.js +145 -0
- package/dist/core/ci-signals.js.map +1 -0
- package/dist/core/config.d.ts +48 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +42 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +14 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +44 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/dashboard.d.ts +40 -0
- package/dist/core/dashboard.d.ts.map +1 -0
- package/dist/core/dashboard.js +413 -0
- package/dist/core/dashboard.js.map +1 -0
- package/dist/core/dispersion.d.ts +12 -0
- package/dist/core/dispersion.d.ts.map +1 -0
- package/dist/core/dispersion.js +164 -0
- package/dist/core/dispersion.js.map +1 -0
- package/dist/core/escalation.d.ts +52 -0
- package/dist/core/escalation.d.ts.map +1 -0
- package/dist/core/escalation.js +105 -0
- package/dist/core/escalation.js.map +1 -0
- package/dist/core/flows.d.ts +44 -0
- package/dist/core/flows.d.ts.map +1 -0
- package/dist/core/flows.js +123 -0
- package/dist/core/flows.js.map +1 -0
- package/dist/core/formatter.d.ts +23 -0
- package/dist/core/formatter.d.ts.map +1 -0
- package/dist/core/formatter.js +301 -0
- package/dist/core/formatter.js.map +1 -0
- package/dist/core/guard.d.ts +124 -0
- package/dist/core/guard.d.ts.map +1 -0
- package/dist/core/guard.js +185 -0
- package/dist/core/guard.js.map +1 -0
- package/dist/core/handicap.d.ts +22 -0
- package/dist/core/handicap.d.ts.map +1 -0
- package/dist/core/handicap.js +111 -0
- package/dist/core/handicap.js.map +1 -0
- package/dist/core/index.d.ts +55 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +62 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/leaderboard.d.ts +32 -0
- package/dist/core/leaderboard.d.ts.map +1 -0
- package/dist/core/leaderboard.js +98 -0
- package/dist/core/leaderboard.js.map +1 -0
- package/dist/core/loader.d.ts +17 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +68 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/metaphor.d.ts +73 -0
- package/dist/core/metaphor.d.ts.map +1 -0
- package/dist/core/metaphor.js +73 -0
- package/dist/core/metaphor.js.map +1 -0
- package/dist/core/metaphors/baseball.d.ts +3 -0
- package/dist/core/metaphors/baseball.d.ts.map +1 -0
- package/dist/core/metaphors/baseball.js +89 -0
- package/dist/core/metaphors/baseball.js.map +1 -0
- package/dist/core/metaphors/dnd.d.ts +3 -0
- package/dist/core/metaphors/dnd.d.ts.map +1 -0
- package/dist/core/metaphors/dnd.js +89 -0
- package/dist/core/metaphors/dnd.js.map +1 -0
- package/dist/core/metaphors/gaming.d.ts +3 -0
- package/dist/core/metaphors/gaming.d.ts.map +1 -0
- package/dist/core/metaphors/gaming.js +89 -0
- package/dist/core/metaphors/gaming.js.map +1 -0
- package/dist/core/metaphors/golf.d.ts +3 -0
- package/dist/core/metaphors/golf.d.ts.map +1 -0
- package/dist/core/metaphors/golf.js +89 -0
- package/dist/core/metaphors/golf.js.map +1 -0
- package/dist/core/metaphors/index.d.ts +8 -0
- package/dist/core/metaphors/index.d.ts.map +1 -0
- package/dist/core/metaphors/index.js +17 -0
- package/dist/core/metaphors/index.js.map +1 -0
- package/dist/core/metaphors/matrix.d.ts +3 -0
- package/dist/core/metaphors/matrix.d.ts.map +1 -0
- package/dist/core/metaphors/matrix.js +89 -0
- package/dist/core/metaphors/matrix.js.map +1 -0
- package/dist/core/metaphors/tennis.d.ts +3 -0
- package/dist/core/metaphors/tennis.d.ts.map +1 -0
- package/dist/core/metaphors/tennis.js +89 -0
- package/dist/core/metaphors/tennis.js.map +1 -0
- package/dist/core/pipeline.d.ts +39 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +158 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/player.d.ts +51 -0
- package/dist/core/player.d.ts.map +1 -0
- package/dist/core/player.js +101 -0
- package/dist/core/player.js.map +1 -0
- package/dist/core/plugins.d.ts +33 -0
- package/dist/core/plugins.d.ts.map +1 -0
- package/dist/core/plugins.js +176 -0
- package/dist/core/plugins.js.map +1 -0
- package/dist/core/pr-signals.d.ts +23 -0
- package/dist/core/pr-signals.d.ts.map +1 -0
- package/dist/core/pr-signals.js +178 -0
- package/dist/core/pr-signals.js.map +1 -0
- package/dist/core/registry.d.ts +20 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +62 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/report.d.ts +50 -0
- package/dist/core/report.d.ts.map +1 -0
- package/dist/core/report.js +392 -0
- package/dist/core/report.js.map +1 -0
- package/dist/core/roadmap.d.ts +74 -0
- package/dist/core/roadmap.d.ts.map +1 -0
- package/dist/core/roadmap.js +389 -0
- package/dist/core/roadmap.js.map +1 -0
- package/dist/core/roles.d.ts +23 -0
- package/dist/core/roles.d.ts.map +1 -0
- package/dist/core/roles.js +107 -0
- package/dist/core/roles.js.map +1 -0
- package/dist/core/standup.d.ts +44 -0
- package/dist/core/standup.d.ts.map +1 -0
- package/dist/core/standup.js +164 -0
- package/dist/core/standup.js.map +1 -0
- package/dist/core/store.d.ts +43 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +11 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/team-handicap.d.ts +59 -0
- package/dist/core/team-handicap.d.ts.map +1 -0
- package/dist/core/team-handicap.js +227 -0
- package/dist/core/team-handicap.js.map +1 -0
- package/dist/core/tournament.d.ts +12 -0
- package/dist/core/tournament.d.ts.map +1 -0
- package/dist/core/tournament.js +249 -0
- package/dist/core/tournament.js.map +1 -0
- package/dist/core/types.d.ts +339 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validation.d.ts +23 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +140 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +17 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +363 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/index.test.d.ts +2 -0
- package/dist/mcp/index.test.d.ts.map +1 -0
- package/dist/mcp/index.test.js +497 -0
- package/dist/mcp/index.test.js.map +1 -0
- package/dist/mcp/registry.d.ts +17 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +708 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/sandbox.d.ts +15 -0
- package/dist/mcp/sandbox.d.ts.map +1 -0
- package/dist/mcp/sandbox.js +153 -0
- package/dist/mcp/sandbox.js.map +1 -0
- package/dist/store/index.d.ts +40 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +324 -0
- package/dist/store/index.js.map +1 -0
- package/dist/tokens/colors.d.ts +47 -0
- package/dist/tokens/colors.d.ts.map +1 -0
- package/dist/tokens/colors.js +56 -0
- package/dist/tokens/colors.js.map +1 -0
- package/dist/tokens/css.d.ts +3 -0
- package/dist/tokens/css.d.ts.map +1 -0
- package/dist/tokens/css.js +58 -0
- package/dist/tokens/css.js.map +1 -0
- package/dist/tokens/index.d.ts +5 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +6 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/spacing.d.ts +23 -0
- package/dist/tokens/spacing.d.ts.map +1 -0
- package/dist/tokens/spacing.js +28 -0
- package/dist/tokens/spacing.js.map +1 -0
- package/dist/tokens/typography.d.ts +28 -0
- package/dist/tokens/typography.d.ts.map +1 -0
- package/dist/tokens/typography.js +34 -0
- package/dist/tokens/typography.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { computeScoreLabel } from './handicap.js';
|
|
2
|
+
// --- Helpers ---
|
|
3
|
+
const MISS_RESULTS = {
|
|
4
|
+
missed_long: 'long',
|
|
5
|
+
missed_short: 'short',
|
|
6
|
+
missed_left: 'left',
|
|
7
|
+
missed_right: 'right',
|
|
8
|
+
};
|
|
9
|
+
const GOOD_RESULTS = new Set(['fairway', 'green', 'in_the_hole']);
|
|
10
|
+
function isValidISODate(s) {
|
|
11
|
+
const d = new Date(s);
|
|
12
|
+
return !isNaN(d.getTime()) && /^\d{4}-\d{2}-\d{2}/.test(s);
|
|
13
|
+
}
|
|
14
|
+
// --- Main validator ---
|
|
15
|
+
/**
|
|
16
|
+
* Validate a SLOPE scorecard for internal consistency.
|
|
17
|
+
* Accepts either `sprint_number` (TypeScript type) or `sprint` (retro JSON field name).
|
|
18
|
+
*/
|
|
19
|
+
export function validateScorecard(card) {
|
|
20
|
+
const errors = [];
|
|
21
|
+
const warnings = [];
|
|
22
|
+
// Normalize sprint field — retro JSONs use "sprint", TS type uses "sprint_number"
|
|
23
|
+
const sprintNumber = card.sprint_number ?? card.sprint;
|
|
24
|
+
// Rule 6: basic field validation
|
|
25
|
+
if (![3, 4, 5].includes(card.par)) {
|
|
26
|
+
errors.push({ code: 'INVALID_PAR', message: `par must be 3, 4, or 5 (got ${card.par})`, field: 'par' });
|
|
27
|
+
}
|
|
28
|
+
if (typeof card.score !== 'number' || card.score <= 0) {
|
|
29
|
+
errors.push({ code: 'INVALID_SCORE', message: `score must be > 0 (got ${card.score})`, field: 'score' });
|
|
30
|
+
}
|
|
31
|
+
if (!card.date || !isValidISODate(card.date)) {
|
|
32
|
+
errors.push({ code: 'INVALID_DATE', message: `date must be a valid ISO string (got "${card.date}")`, field: 'date' });
|
|
33
|
+
}
|
|
34
|
+
if (sprintNumber == null || typeof sprintNumber !== 'number' || sprintNumber <= 0) {
|
|
35
|
+
errors.push({ code: 'MISSING_SPRINT', message: 'sprint_number (or sprint) is required and must be > 0', field: 'sprint_number' });
|
|
36
|
+
}
|
|
37
|
+
// Rule 1: score_label matches computeScoreLabel(score, par)
|
|
38
|
+
if (typeof card.score === 'number' && card.score > 0 && [3, 4, 5].includes(card.par)) {
|
|
39
|
+
const expected = computeScoreLabel(card.score, card.par);
|
|
40
|
+
if (card.score_label !== expected) {
|
|
41
|
+
errors.push({
|
|
42
|
+
code: 'SCORE_LABEL_MISMATCH',
|
|
43
|
+
message: `score_label "${card.score_label}" doesn't match computed "${expected}" (score=${card.score}, par=${card.par})`,
|
|
44
|
+
field: 'score_label',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Rule 2: stat bounds
|
|
49
|
+
const stats = card.stats;
|
|
50
|
+
if (stats) {
|
|
51
|
+
if (stats.fairways_hit > stats.fairways_total) {
|
|
52
|
+
errors.push({
|
|
53
|
+
code: 'FAIRWAYS_OVERFLOW',
|
|
54
|
+
message: `fairways_hit (${stats.fairways_hit}) > fairways_total (${stats.fairways_total})`,
|
|
55
|
+
field: 'stats.fairways_hit',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (stats.greens_in_regulation > stats.greens_total) {
|
|
59
|
+
errors.push({
|
|
60
|
+
code: 'GIR_OVERFLOW',
|
|
61
|
+
message: `greens_in_regulation (${stats.greens_in_regulation}) > greens_total (${stats.greens_total})`,
|
|
62
|
+
field: 'stats.greens_in_regulation',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Rule 3: shots.length matches stats.fairways_total
|
|
67
|
+
if (stats && card.shots) {
|
|
68
|
+
if (card.shots.length !== stats.fairways_total) {
|
|
69
|
+
errors.push({
|
|
70
|
+
code: 'SHOTS_COUNT_MISMATCH',
|
|
71
|
+
message: `shots.length (${card.shots.length}) doesn't match stats.fairways_total (${stats.fairways_total})`,
|
|
72
|
+
field: 'shots',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Rule 4: hazards_hit consistent with total hazard count from shots
|
|
77
|
+
if (stats && card.shots) {
|
|
78
|
+
const totalHazards = card.shots.reduce((sum, s) => sum + s.hazards.length, 0);
|
|
79
|
+
if (stats.hazards_hit !== totalHazards) {
|
|
80
|
+
errors.push({
|
|
81
|
+
code: 'HAZARDS_COUNT_MISMATCH',
|
|
82
|
+
message: `stats.hazards_hit (${stats.hazards_hit}) doesn't match total hazards from shots (${totalHazards})`,
|
|
83
|
+
field: 'stats.hazards_hit',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Rule 4b: hazard severity values must be valid
|
|
87
|
+
const VALID_SEVERITIES = new Set(['minor', 'moderate', 'major', 'critical']);
|
|
88
|
+
for (const shot of card.shots) {
|
|
89
|
+
for (const hazard of shot.hazards) {
|
|
90
|
+
if (hazard.severity != null && !VALID_SEVERITIES.has(hazard.severity)) {
|
|
91
|
+
errors.push({
|
|
92
|
+
code: 'INVALID_HAZARD_SEVERITY',
|
|
93
|
+
message: `hazard severity "${hazard.severity}" is not valid (expected minor|moderate|major|critical)`,
|
|
94
|
+
field: 'shots[].hazards[].severity',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Rule 5: miss_directions consistent with shot results
|
|
101
|
+
if (stats && card.shots) {
|
|
102
|
+
const computedMiss = { long: 0, short: 0, left: 0, right: 0 };
|
|
103
|
+
for (const shot of card.shots) {
|
|
104
|
+
const dir = MISS_RESULTS[shot.result];
|
|
105
|
+
if (dir) {
|
|
106
|
+
computedMiss[dir]++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const dir of ['long', 'short', 'left', 'right']) {
|
|
110
|
+
const actual = stats.miss_directions[dir] ?? 0;
|
|
111
|
+
const expected = computedMiss[dir];
|
|
112
|
+
if (actual !== expected) {
|
|
113
|
+
errors.push({
|
|
114
|
+
code: 'MISS_DIRECTION_MISMATCH',
|
|
115
|
+
message: `miss_directions.${dir} is ${actual} but ${expected} shots had missed_${dir} result`,
|
|
116
|
+
field: `stats.miss_directions.${dir}`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Rule 7: warnings for optional but recommended fields
|
|
122
|
+
if (!card.player) {
|
|
123
|
+
warnings.push({ code: 'NO_PLAYER', message: 'No player field — scorecard attributed to default player' });
|
|
124
|
+
}
|
|
125
|
+
if (!card.bunker_locations || card.bunker_locations.length === 0) {
|
|
126
|
+
warnings.push({ code: 'EMPTY_BUNKERS', message: 'No bunker_locations recorded — consider noting hazards for future sprints' });
|
|
127
|
+
}
|
|
128
|
+
if (!card.training || card.training.length === 0) {
|
|
129
|
+
warnings.push({ code: 'NO_TRAINING', message: 'No training sessions recorded' });
|
|
130
|
+
}
|
|
131
|
+
if (!card.nutrition || card.nutrition.length === 0) {
|
|
132
|
+
warnings.push({ code: 'NO_NUTRITION', message: 'No nutrition (dev health) entries recorded' });
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
valid: errors.length === 0,
|
|
136
|
+
errors,
|
|
137
|
+
warnings,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iBAAiB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// SLOPE — Sprint Lifecycle & Operational Performance Engine
|
|
2
|
+
// Single package barrel export
|
|
3
|
+
// Tokens (design tokens: colors, spacing, typography)
|
|
4
|
+
export * from './tokens/index.js';
|
|
5
|
+
// Core (scoring engine, types, advisor, formatter, etc.)
|
|
6
|
+
export * from './core/index.js';
|
|
7
|
+
// Store (SQLite adapter)
|
|
8
|
+
export { SqliteSlopeStore, createStore } from './store/index.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,+BAA+B;AAE/B,sDAAsD;AACtD,cAAc,mBAAmB,CAAC;AAElC,yDAAyD;AACzD,cAAc,iBAAiB,CAAC;AAEhC,yBAAyB;AACzB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import type { SlopeStore } from '../core/index.js';
|
|
4
|
+
/** Tool names exposed by this MCP server (for tests and tool discovery). */
|
|
5
|
+
export declare const SLOPE_MCP_TOOL_NAMES: readonly ["search", "execute", "session_status", "acquire_claim", "check_conflicts"];
|
|
6
|
+
/** Detection results for hook/settings activation status. */
|
|
7
|
+
export interface SetupHints {
|
|
8
|
+
guardsInstalled: boolean;
|
|
9
|
+
lifecycleHooksInstalled: boolean;
|
|
10
|
+
settingsConfigured: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Detect which SLOPE hooks and settings are activated in the project. */
|
|
13
|
+
export declare function detectSetupHints(projectRoot: string): SetupHints;
|
|
14
|
+
/** Build a markdown hint string, or null if everything is already set up. */
|
|
15
|
+
export declare function buildSetupHint(hints: SetupHints): string | null;
|
|
16
|
+
export declare function createSlopeToolsServer(store?: SlopeStore, setupHints?: SetupHints): McpServer;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AAkBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,sFAAuF,CAAC;AAEzH,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;IACjC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAkChE;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CA+B/D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAwI7F"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @slope-dev/slope — Code-mode MCP server for SLOPE.
|
|
4
|
+
*
|
|
5
|
+
* Exposes up to 5 tools:
|
|
6
|
+
* search() — discover the SLOPE API (functions, types, constants)
|
|
7
|
+
* execute() — run JS in a sandboxed node:vm with the full API pre-injected
|
|
8
|
+
* session_status() — show active sessions and claims (requires store)
|
|
9
|
+
* acquire_claim() — claim a ticket/area (requires store)
|
|
10
|
+
* check_conflicts() — detect overlapping claims (requires store)
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* npx @slope-dev/slope # stdio transport
|
|
14
|
+
* import { createSlopeToolsServer } # programmatic
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { join, dirname } from 'node:path';
|
|
18
|
+
import { execSync } from 'node:child_process';
|
|
19
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
20
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
import { SLOPE_REGISTRY, SLOPE_TYPES } from './registry.js';
|
|
23
|
+
import { runInSandbox } from './sandbox.js';
|
|
24
|
+
import { checkConflicts, loadFlows, checkFlowStaleness } from '../core/index.js';
|
|
25
|
+
/** Tool names exposed by this MCP server (for tests and tool discovery). */
|
|
26
|
+
export const SLOPE_MCP_TOOL_NAMES = ['search', 'execute', 'session_status', 'acquire_claim', 'check_conflicts'];
|
|
27
|
+
/** Detect which SLOPE hooks and settings are activated in the project. */
|
|
28
|
+
export function detectSetupHints(projectRoot) {
|
|
29
|
+
const hints = {
|
|
30
|
+
guardsInstalled: false,
|
|
31
|
+
lifecycleHooksInstalled: false,
|
|
32
|
+
settingsConfigured: false,
|
|
33
|
+
};
|
|
34
|
+
// Check .slope/hooks.json for guard-* and lifecycle hook entries
|
|
35
|
+
const hooksPath = join(projectRoot, '.slope', 'hooks.json');
|
|
36
|
+
if (existsSync(hooksPath)) {
|
|
37
|
+
try {
|
|
38
|
+
const hooksData = JSON.parse(readFileSync(hooksPath, 'utf-8'));
|
|
39
|
+
const installed = hooksData?.installed ?? {};
|
|
40
|
+
const keys = Object.keys(installed);
|
|
41
|
+
hints.guardsInstalled = keys.some((k) => k.startsWith('guard-'));
|
|
42
|
+
hints.lifecycleHooksInstalled =
|
|
43
|
+
keys.includes('session-start') && keys.includes('session-end');
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Malformed JSON — treat as not installed
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Check .claude/settings.json for slope-guard.sh in hooks commands
|
|
50
|
+
const settingsPath = join(projectRoot, '.claude', 'settings.json');
|
|
51
|
+
if (existsSync(settingsPath)) {
|
|
52
|
+
try {
|
|
53
|
+
const raw = readFileSync(settingsPath, 'utf-8');
|
|
54
|
+
hints.settingsConfigured = raw.includes('slope-guard.sh');
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Unreadable — treat as not configured
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return hints;
|
|
61
|
+
}
|
|
62
|
+
/** Build a markdown hint string, or null if everything is already set up. */
|
|
63
|
+
export function buildSetupHint(hints) {
|
|
64
|
+
const missing = [];
|
|
65
|
+
if (!hints.guardsInstalled) {
|
|
66
|
+
missing.push('- **Guard hooks** (explore, hazard, commit-nudge, scope-drift, compaction, stop-check):\n' +
|
|
67
|
+
' Proactive guidance during coding. Install with: `slope hook add --level=full`');
|
|
68
|
+
}
|
|
69
|
+
if (!hints.lifecycleHooksInstalled) {
|
|
70
|
+
missing.push('- **Lifecycle hooks** (session-start, session-end):\n' +
|
|
71
|
+
' Automatic session tracking and briefings.\n' +
|
|
72
|
+
' Install with: `slope hook add session-start && slope hook add session-end`');
|
|
73
|
+
}
|
|
74
|
+
if (!hints.settingsConfigured && !hints.guardsInstalled) {
|
|
75
|
+
// Settings only matter if guards aren't installed; if guards are installed
|
|
76
|
+
// but settings are missing, the hook add command handles both.
|
|
77
|
+
}
|
|
78
|
+
if (missing.length === 0)
|
|
79
|
+
return null;
|
|
80
|
+
return ('---\n' +
|
|
81
|
+
'SLOPE Setup Hint: The following hooks are not yet activated:\n\n' +
|
|
82
|
+
missing.join('\n\n') +
|
|
83
|
+
'\n\nRun the commands above, then restart your session to activate.');
|
|
84
|
+
}
|
|
85
|
+
export function createSlopeToolsServer(store, setupHints) {
|
|
86
|
+
const server = new McpServer({
|
|
87
|
+
name: 'slope-tools',
|
|
88
|
+
version: '1.0.0',
|
|
89
|
+
});
|
|
90
|
+
server.tool('search', 'Discover SLOPE API functions, filesystem helpers, constants, and type definitions. Call with no args to see everything, or filter by query/module.', {
|
|
91
|
+
query: z.string().optional().describe('Case-insensitive search term to filter by name or description'),
|
|
92
|
+
module: z.enum(['core', 'fs', 'constants', 'types', 'store', 'map', 'flows']).optional().describe('Filter by module category'),
|
|
93
|
+
}, async ({ query, module }) => {
|
|
94
|
+
// Map module — return codebase map content
|
|
95
|
+
if (module === 'map') {
|
|
96
|
+
return { content: [{ type: 'text', text: handleMapQuery(query) }] };
|
|
97
|
+
}
|
|
98
|
+
// Flows module — return flow definitions
|
|
99
|
+
if (module === 'flows') {
|
|
100
|
+
return { content: [{ type: 'text', text: handleFlowsQuery(query) }] };
|
|
101
|
+
}
|
|
102
|
+
if (module === 'types') {
|
|
103
|
+
return { content: [{ type: 'text', text: SLOPE_TYPES }] };
|
|
104
|
+
}
|
|
105
|
+
let results = SLOPE_REGISTRY;
|
|
106
|
+
if (module) {
|
|
107
|
+
results = results.filter((e) => e.module === module);
|
|
108
|
+
}
|
|
109
|
+
if (query) {
|
|
110
|
+
const q = query.toLowerCase();
|
|
111
|
+
results = results.filter((e) => e.name.toLowerCase().includes(q) || e.description.toLowerCase().includes(q));
|
|
112
|
+
}
|
|
113
|
+
const content = [
|
|
114
|
+
{ type: 'text', text: JSON.stringify(results, null, 2) },
|
|
115
|
+
];
|
|
116
|
+
// Append setup hint only on unfiltered discovery calls (no query, no module)
|
|
117
|
+
if (!query && !module && setupHints) {
|
|
118
|
+
const hint = buildSetupHint(setupHints);
|
|
119
|
+
if (hint) {
|
|
120
|
+
content.push({ type: 'text', text: hint });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { content };
|
|
124
|
+
});
|
|
125
|
+
server.tool('execute', 'Run JavaScript code in a sandboxed environment with the full SLOPE API and filesystem helpers pre-injected. Use `return` to produce output. Call search() first to discover available functions.', {
|
|
126
|
+
code: z.string().describe('JavaScript code to execute. Use `return` for output. All SLOPE core functions, constants, and fs helpers are available as top-level names.'),
|
|
127
|
+
}, async ({ code }) => {
|
|
128
|
+
try {
|
|
129
|
+
const { result, logs } = await runInSandbox(code, process.cwd());
|
|
130
|
+
const parts = [];
|
|
131
|
+
if (logs.length > 0) {
|
|
132
|
+
parts.push({ type: 'text', text: '--- logs ---\n' + logs.join('\n') });
|
|
133
|
+
}
|
|
134
|
+
parts.push({ type: 'text', text: JSON.stringify(result, null, 2) ?? 'undefined' });
|
|
135
|
+
return { content: parts };
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
139
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Store-backed tools (only available when a store is provided)
|
|
143
|
+
if (store) {
|
|
144
|
+
server.tool('session_status', 'Show active SLOPE sessions and their claims.', {}, async () => {
|
|
145
|
+
const sessions = await store.getActiveSessions();
|
|
146
|
+
const claims = await store.getActiveClaims();
|
|
147
|
+
return {
|
|
148
|
+
content: [{
|
|
149
|
+
type: 'text',
|
|
150
|
+
text: JSON.stringify({ sessions, claims }, null, 2),
|
|
151
|
+
}],
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
server.tool('acquire_claim', 'Claim a ticket or area for the current sprint.', {
|
|
155
|
+
sessionId: z.string().describe('Session ID to associate with the claim'),
|
|
156
|
+
target: z.string().describe('Ticket key or area path to claim'),
|
|
157
|
+
scope: z.enum(['ticket', 'area']).describe('Claim scope: ticket or area'),
|
|
158
|
+
sprintNumber: z.number().describe('Sprint number'),
|
|
159
|
+
player: z.string().describe('Player name'),
|
|
160
|
+
}, async ({ sessionId, target, scope, sprintNumber, player }) => {
|
|
161
|
+
const claim = await store.claim({
|
|
162
|
+
sprint_number: sprintNumber,
|
|
163
|
+
player,
|
|
164
|
+
target,
|
|
165
|
+
scope: scope,
|
|
166
|
+
session_id: sessionId,
|
|
167
|
+
});
|
|
168
|
+
return {
|
|
169
|
+
content: [{
|
|
170
|
+
type: 'text',
|
|
171
|
+
text: JSON.stringify(claim, null, 2),
|
|
172
|
+
}],
|
|
173
|
+
};
|
|
174
|
+
});
|
|
175
|
+
server.tool('check_conflicts', 'Detect overlapping and adjacent conflicts among sprint claims.', {
|
|
176
|
+
sprintNumber: z.number().optional().describe('Optional sprint number to filter claims'),
|
|
177
|
+
}, async ({ sprintNumber }) => {
|
|
178
|
+
const claims = await store.getActiveClaims(sprintNumber);
|
|
179
|
+
const conflicts = checkConflicts(claims);
|
|
180
|
+
return {
|
|
181
|
+
content: [{
|
|
182
|
+
type: 'text',
|
|
183
|
+
text: JSON.stringify({ claims: claims.length, conflicts }, null, 2),
|
|
184
|
+
}],
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return server;
|
|
189
|
+
}
|
|
190
|
+
/** Handle search({ module: 'map' }) — return codebase map content with optional section filtering */
|
|
191
|
+
function handleMapQuery(query) {
|
|
192
|
+
const cwd = process.cwd();
|
|
193
|
+
const mapPath = join(cwd, 'CODEBASE.md');
|
|
194
|
+
if (!existsSync(mapPath)) {
|
|
195
|
+
return 'No codebase map found at CODEBASE.md. Run `slope map` to generate one.';
|
|
196
|
+
}
|
|
197
|
+
const content = readFileSync(mapPath, 'utf8');
|
|
198
|
+
let result = '';
|
|
199
|
+
// Check staleness from metadata
|
|
200
|
+
const metaMatch = content.match(/^---\n([\s\S]*?)\n---/m);
|
|
201
|
+
if (metaMatch) {
|
|
202
|
+
const gitShaMatch = metaMatch[1].match(/git_sha:\s*"?([^"\n]+)"?/);
|
|
203
|
+
if (gitShaMatch) {
|
|
204
|
+
try {
|
|
205
|
+
const distance = parseInt(execSync(`git rev-list --count ${gitShaMatch[1]}..HEAD 2>/dev/null`, { cwd, encoding: 'utf8' }).trim() || '0', 10);
|
|
206
|
+
if (distance > 50) {
|
|
207
|
+
result += `⚠️ WARNING: Codebase map is stale (${distance} commits behind). Run \`slope map\` to refresh.\n\n`;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch { /* git command failed — skip staleness check */ }
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (query) {
|
|
214
|
+
// Filter to sections matching the query
|
|
215
|
+
const q = query.toLowerCase();
|
|
216
|
+
const sections = content.split(/^(?=## )/m);
|
|
217
|
+
const matched = sections.filter(s => {
|
|
218
|
+
const heading = s.match(/^## (.+)/)?.[1] ?? '';
|
|
219
|
+
return heading.toLowerCase().includes(q);
|
|
220
|
+
});
|
|
221
|
+
if (matched.length === 0) {
|
|
222
|
+
result += `No sections matching "${query}" found in codebase map. Available sections:\n`;
|
|
223
|
+
const headings = content.match(/^## .+/gm) ?? [];
|
|
224
|
+
result += headings.map(h => `- ${h.replace('## ', '')}`).join('\n');
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
result += matched.join('\n');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
result += content;
|
|
232
|
+
}
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
/** Handle search({ module: 'flows' }) — return flow definitions with optional filtering */
|
|
236
|
+
function handleFlowsQuery(query) {
|
|
237
|
+
const cwd = process.cwd();
|
|
238
|
+
// Resolve flows path from config (config.json is already in .slope/)
|
|
239
|
+
let flowsPath;
|
|
240
|
+
try {
|
|
241
|
+
const configPath = join(cwd, '.slope', 'config.json');
|
|
242
|
+
if (existsSync(configPath)) {
|
|
243
|
+
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
244
|
+
flowsPath = join(cwd, config.flowsPath || '.slope/flows.json');
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
flowsPath = join(cwd, '.slope', 'flows.json');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
flowsPath = join(cwd, '.slope', 'flows.json');
|
|
252
|
+
}
|
|
253
|
+
const flows = loadFlows(flowsPath);
|
|
254
|
+
if (!flows) {
|
|
255
|
+
return 'No flows defined. Run `slope flows init` to create .slope/flows.json.';
|
|
256
|
+
}
|
|
257
|
+
if (flows.flows.length === 0) {
|
|
258
|
+
return 'Flows file exists but contains no flow definitions.';
|
|
259
|
+
}
|
|
260
|
+
// Get current git SHA for staleness check
|
|
261
|
+
let currentSha = '';
|
|
262
|
+
try {
|
|
263
|
+
currentSha = execSync('git rev-parse HEAD 2>/dev/null', { cwd, encoding: 'utf8', timeout: 5000 }).trim();
|
|
264
|
+
}
|
|
265
|
+
catch { /* not in git repo */ }
|
|
266
|
+
// Filter flows by query
|
|
267
|
+
let matched = flows.flows;
|
|
268
|
+
if (query) {
|
|
269
|
+
const q = query.toLowerCase();
|
|
270
|
+
matched = flows.flows.filter(f => f.id.toLowerCase().includes(q) ||
|
|
271
|
+
f.title.toLowerCase().includes(q) ||
|
|
272
|
+
f.tags.some(t => t.toLowerCase().includes(q)));
|
|
273
|
+
}
|
|
274
|
+
if (matched.length === 0) {
|
|
275
|
+
const allIds = flows.flows.map(f => f.id).join(', ');
|
|
276
|
+
return `No flows matching "${query}". Available flows: ${allIds}`;
|
|
277
|
+
}
|
|
278
|
+
// Format output
|
|
279
|
+
const sections = [];
|
|
280
|
+
for (const flow of matched) {
|
|
281
|
+
const lines = [];
|
|
282
|
+
lines.push(`## ${flow.title} (\`${flow.id}\`)`);
|
|
283
|
+
lines.push('');
|
|
284
|
+
lines.push(flow.description);
|
|
285
|
+
lines.push('');
|
|
286
|
+
lines.push(`**Entry point:** ${flow.entry_point}`);
|
|
287
|
+
lines.push(`**Tags:** ${flow.tags.join(', ') || '—'}`);
|
|
288
|
+
// Staleness
|
|
289
|
+
if (currentSha && flow.last_verified_sha) {
|
|
290
|
+
const { stale, changedFiles } = checkFlowStaleness(flow, currentSha, cwd);
|
|
291
|
+
if (stale) {
|
|
292
|
+
lines.push(`**Status:** STALE (${changedFiles.length} file(s) changed: ${changedFiles.join(', ')})`);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
lines.push('**Status:** Current');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else if (!flow.last_verified_sha) {
|
|
299
|
+
lines.push('**Status:** Unverified');
|
|
300
|
+
}
|
|
301
|
+
lines.push('');
|
|
302
|
+
lines.push('**Files:**');
|
|
303
|
+
for (const f of flow.files) {
|
|
304
|
+
lines.push(`- \`${f}\``);
|
|
305
|
+
}
|
|
306
|
+
if (flow.steps.length > 0) {
|
|
307
|
+
lines.push('');
|
|
308
|
+
lines.push('**Steps:**');
|
|
309
|
+
for (let i = 0; i < flow.steps.length; i++) {
|
|
310
|
+
const step = flow.steps[i];
|
|
311
|
+
lines.push(`${i + 1}. **${step.name}** — ${step.description}`);
|
|
312
|
+
for (const fp of step.file_paths) {
|
|
313
|
+
lines.push(` - \`${fp}\``);
|
|
314
|
+
}
|
|
315
|
+
if (step.notes) {
|
|
316
|
+
lines.push(` _${step.notes}_`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
sections.push(lines.join('\n'));
|
|
321
|
+
}
|
|
322
|
+
return sections.join('\n\n---\n\n');
|
|
323
|
+
}
|
|
324
|
+
/** Walk up directories looking for .slope/config.json */
|
|
325
|
+
function findProjectRoot(startDir) {
|
|
326
|
+
let dir = startDir;
|
|
327
|
+
while (true) {
|
|
328
|
+
if (existsSync(join(dir, '.slope', 'config.json'))) {
|
|
329
|
+
return dir;
|
|
330
|
+
}
|
|
331
|
+
const parent = dirname(dir);
|
|
332
|
+
if (parent === dir) {
|
|
333
|
+
throw new Error('No .slope/config.json found in any parent directory');
|
|
334
|
+
}
|
|
335
|
+
dir = parent;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
async function main() {
|
|
339
|
+
let store;
|
|
340
|
+
let hints;
|
|
341
|
+
try {
|
|
342
|
+
const { loadConfig } = await import('../core/index.js');
|
|
343
|
+
const { createStore } = await import('../store/index.js');
|
|
344
|
+
const cwd = findProjectRoot(process.cwd());
|
|
345
|
+
const config = loadConfig(cwd);
|
|
346
|
+
store = createStore({ storePath: config.store_path ?? '.slope/slope.db', cwd });
|
|
347
|
+
hints = detectSetupHints(cwd);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// No config or store — server runs without store tools
|
|
351
|
+
}
|
|
352
|
+
const server = createSlopeToolsServer(store, hints);
|
|
353
|
+
const transport = new StdioServerTransport();
|
|
354
|
+
await server.connect(transport);
|
|
355
|
+
}
|
|
356
|
+
const isDirectRun = process.argv[1]?.endsWith('index.js') || process.argv[1]?.endsWith('mcp-slope-tools');
|
|
357
|
+
if (isDirectRun) {
|
|
358
|
+
main().catch((err) => {
|
|
359
|
+
process.stderr.write(`MCP server error: ${err}\n`);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/mcp/index.test.ts"],"names":[],"mappings":""}
|