@slope-dev/slope 1.57.0 → 1.57.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/dist/cli/commands/briefing.d.ts.map +1 -1
- package/dist/cli/commands/briefing.js +17 -0
- package/dist/cli/commands/briefing.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +6 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/guard.d.ts +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +332 -6
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +6 -0
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +63 -4
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +3 -27
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/worktree.d.ts.map +1 -1
- package/dist/cli/commands/worktree.js +23 -0
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/error-reporter.d.ts +3 -0
- package/dist/cli/error-reporter.d.ts.map +1 -0
- package/dist/cli/error-reporter.js +20 -0
- package/dist/cli/error-reporter.js.map +1 -0
- package/dist/cli/guards/push-nudge.d.ts.map +1 -1
- package/dist/cli/guards/push-nudge.js +4 -1
- package/dist/cli/guards/push-nudge.js.map +1 -1
- package/dist/cli/index.js +55 -213
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/pre-sprint-reality.d.ts +33 -0
- package/dist/cli/pre-sprint-reality.d.ts.map +1 -0
- package/dist/cli/pre-sprint-reality.js +253 -0
- package/dist/cli/pre-sprint-reality.js.map +1 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +6 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/loader.d.ts +1 -0
- package/dist/core/loader.d.ts.map +1 -1
- package/dist/core/loader.js +80 -22
- package/dist/core/loader.js.map +1 -1
- package/dist/core/validation.d.ts +2 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +12 -8
- package/dist/core/validation.js.map +1 -1
- package/package.json +1 -1
- package/packages/pi-extension/dist/index.js +4 -1
- package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
package/dist/core/loader.js
CHANGED
|
@@ -1,12 +1,37 @@
|
|
|
1
1
|
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { normalizeStats } from './builder.js';
|
|
4
|
+
import { computePar, computeScoreLabel } from './handicap.js';
|
|
4
5
|
import { compareSprintIds, nextCanonicalSprintId } from './roadmap.js';
|
|
5
6
|
/**
|
|
6
7
|
* Load SLOPE scorecards from the configured directory.
|
|
7
8
|
* Filters by minSprint and normalizes sprint_number.
|
|
8
9
|
*/
|
|
9
10
|
export function loadScorecards(config, cwd = process.cwd()) {
|
|
11
|
+
const candidates = discoverScorecardCandidatesForConfig(config, cwd);
|
|
12
|
+
const scorecards = [];
|
|
13
|
+
const loadedSprints = new Set();
|
|
14
|
+
for (const candidate of candidates) {
|
|
15
|
+
if (loadedSprints.has(candidate.sprintNumber))
|
|
16
|
+
continue;
|
|
17
|
+
try {
|
|
18
|
+
const raw = JSON.parse(readFileSync(candidate.path, 'utf8'));
|
|
19
|
+
const card = normalizeScorecard(raw);
|
|
20
|
+
if (card.sprint_number < config.minSprint || loadedSprints.has(card.sprint_number))
|
|
21
|
+
continue;
|
|
22
|
+
scorecards.push(card);
|
|
23
|
+
loadedSprints.add(card.sprint_number);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
console.error(` Warning: Could not parse ${candidate.label}, skipping`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return scorecards;
|
|
30
|
+
}
|
|
31
|
+
export function discoverScorecardFiles(config, cwd = process.cwd()) {
|
|
32
|
+
return discoverScorecardCandidatesForConfig(config, cwd).map((candidate) => candidate.path);
|
|
33
|
+
}
|
|
34
|
+
function discoverScorecardCandidatesForConfig(config, cwd) {
|
|
10
35
|
const dir = join(cwd, config.scorecardDir);
|
|
11
36
|
if (!existsSync(dir)) {
|
|
12
37
|
return [];
|
|
@@ -16,31 +41,21 @@ export function loadScorecards(config, cwd = process.cwd()) {
|
|
|
16
41
|
const prefix = patternParts[0] ?? '';
|
|
17
42
|
const suffix = patternParts[1] ?? '';
|
|
18
43
|
const regex = new RegExp(`^${escapeRegex(prefix)}(\\d+(?:\\.\\d+)?)${escapeRegex(suffix)}$`);
|
|
19
|
-
const
|
|
20
|
-
.filter((
|
|
44
|
+
const candidates = discoverScorecardCandidates(dir, regex)
|
|
45
|
+
.filter((candidate) => candidate.sprintNumber >= config.minSprint)
|
|
21
46
|
.sort((a, b) => {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
return compareSprintIds(na, nb);
|
|
47
|
+
const bySprint = compareSprintIds(a.sprintNumber, b.sprintNumber);
|
|
48
|
+
return bySprint === 0 ? a.priority - b.priority : bySprint;
|
|
25
49
|
});
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (
|
|
50
|
+
const loadedSprints = new Set();
|
|
51
|
+
const dedupedCandidates = [];
|
|
52
|
+
for (const candidate of candidates) {
|
|
53
|
+
if (loadedSprints.has(candidate.sprintNumber))
|
|
30
54
|
continue;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
continue;
|
|
34
|
-
try {
|
|
35
|
-
const raw = JSON.parse(readFileSync(join(dir, file), 'utf8'));
|
|
36
|
-
const card = normalizeScorecard(raw);
|
|
37
|
-
scorecards.push(card);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
console.error(` Warning: Could not parse ${file}, skipping`);
|
|
41
|
-
}
|
|
55
|
+
dedupedCandidates.push(candidate);
|
|
56
|
+
loadedSprints.add(candidate.sprintNumber);
|
|
42
57
|
}
|
|
43
|
-
return
|
|
58
|
+
return dedupedCandidates;
|
|
44
59
|
}
|
|
45
60
|
/**
|
|
46
61
|
* Detect the latest sprint number from existing scorecards.
|
|
@@ -70,10 +85,20 @@ export function resolveCurrentSprint(config, cwd = process.cwd()) {
|
|
|
70
85
|
*/
|
|
71
86
|
export function normalizeScorecard(raw) {
|
|
72
87
|
const card = { ...raw };
|
|
88
|
+
const shotCount = card.shots?.length ?? 0;
|
|
89
|
+
const ticketCount = card.tickets?.length ?? shotCount;
|
|
73
90
|
// Normalize sprint_number
|
|
74
91
|
card.sprint_number = card.sprint_number ?? card.sprint;
|
|
92
|
+
if (typeof card.par !== 'number' || Number.isNaN(card.par)) {
|
|
93
|
+
card.par = computePar(ticketCount);
|
|
94
|
+
}
|
|
95
|
+
if (typeof card.score !== 'number' || Number.isNaN(card.score)) {
|
|
96
|
+
card.score = card.par;
|
|
97
|
+
}
|
|
98
|
+
if (typeof card.score_label !== 'string') {
|
|
99
|
+
card.score_label = computeScoreLabel(card.score, card.par);
|
|
100
|
+
}
|
|
75
101
|
// Normalize hole_stats → stats using the existing normalizeStats coercion
|
|
76
|
-
const shotCount = card.shots?.length ?? 0;
|
|
77
102
|
if (card.hole_stats && !card.stats) {
|
|
78
103
|
card.stats = normalizeStats(card.hole_stats, shotCount);
|
|
79
104
|
delete card.hole_stats;
|
|
@@ -87,4 +112,37 @@ export function normalizeScorecard(raw) {
|
|
|
87
112
|
function escapeRegex(s) {
|
|
88
113
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
89
114
|
}
|
|
115
|
+
function discoverScorecardCandidates(dir, regex) {
|
|
116
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
117
|
+
const candidates = [];
|
|
118
|
+
for (const entry of entries) {
|
|
119
|
+
if (entry.isFile()) {
|
|
120
|
+
const match = entry.name.match(regex);
|
|
121
|
+
if (!match)
|
|
122
|
+
continue;
|
|
123
|
+
candidates.push({
|
|
124
|
+
path: join(dir, entry.name),
|
|
125
|
+
sprintNumber: parseFloat(match[1] ?? '0'),
|
|
126
|
+
priority: 0,
|
|
127
|
+
label: entry.name,
|
|
128
|
+
});
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!entry.isDirectory())
|
|
132
|
+
continue;
|
|
133
|
+
const nestedMatch = entry.name.match(/^s(?:print-)?(\d+(?:\.\d+)?)$/i);
|
|
134
|
+
if (!nestedMatch)
|
|
135
|
+
continue;
|
|
136
|
+
const nestedPath = join(dir, entry.name, 'scorecard.json');
|
|
137
|
+
if (!existsSync(nestedPath))
|
|
138
|
+
continue;
|
|
139
|
+
candidates.push({
|
|
140
|
+
path: nestedPath,
|
|
141
|
+
sprintNumber: parseFloat(nestedMatch[1] ?? '0'),
|
|
142
|
+
priority: 1,
|
|
143
|
+
label: `${entry.name}/scorecard.json`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return candidates;
|
|
147
|
+
}
|
|
90
148
|
//# sourceMappingURL=loader.js.map
|
package/dist/core/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,5 +22,7 @@ export interface ScorecardValidationOptions {
|
|
|
22
22
|
*/
|
|
23
23
|
export declare function validateScorecard(card: GolfScorecard & {
|
|
24
24
|
sprint?: number;
|
|
25
|
+
completed_on?: string;
|
|
26
|
+
started_on?: string;
|
|
25
27
|
}, options?: ScorecardValidationOptions): ScorecardValidationResult;
|
|
26
28
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAC;AAM5E,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,QAAQ,EAAE,0BAA0B,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CACxC;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAC;AAM5E,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,QAAQ,EAAE,0BAA0B,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CACxC;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACrF,OAAO,GAAE,0BAA+B,GACvC,yBAAyB,CA6I3B"}
|
package/dist/core/validation.js
CHANGED
|
@@ -29,27 +29,31 @@ export function validateScorecard(card, options = {}) {
|
|
|
29
29
|
: null;
|
|
30
30
|
// Normalize sprint field — retro JSONs use "sprint", TS type uses "sprint_number"
|
|
31
31
|
const sprintNumber = card.sprint_number ?? card.sprint;
|
|
32
|
+
const validPar = [3, 4, 5].includes(card.par);
|
|
33
|
+
const hasExplicitScore = typeof card.score === 'number' && !Number.isNaN(card.score);
|
|
34
|
+
const effectiveScore = hasExplicitScore ? card.score : validPar ? card.par : undefined;
|
|
35
|
+
const effectiveDate = card.date ?? card.completed_on ?? card.started_on;
|
|
32
36
|
// Rule 6: basic field validation
|
|
33
|
-
if (!
|
|
37
|
+
if (!validPar) {
|
|
34
38
|
errors.push({ code: 'INVALID_PAR', message: `par must be 3, 4, or 5 (got ${card.par})`, field: 'par' });
|
|
35
39
|
}
|
|
36
|
-
if (typeof
|
|
40
|
+
if (typeof effectiveScore !== 'number' || effectiveScore <= 0) {
|
|
37
41
|
errors.push({ code: 'INVALID_SCORE', message: `score must be > 0 (got ${card.score})`, field: 'score' });
|
|
38
42
|
}
|
|
39
|
-
if (
|
|
40
|
-
errors.push({ code: 'INVALID_DATE', message: `date must be a valid ISO string (got "${
|
|
43
|
+
if (typeof effectiveDate !== 'string' || !isValidISODate(effectiveDate)) {
|
|
44
|
+
errors.push({ code: 'INVALID_DATE', message: `date must be a valid ISO string (got "${effectiveDate}")`, field: 'date' });
|
|
41
45
|
}
|
|
42
46
|
if (sprintNumber == null || typeof sprintNumber !== 'number' || sprintNumber <= 0) {
|
|
43
47
|
errors.push({ code: 'MISSING_SPRINT', message: 'sprint_number (or sprint) is required and must be > 0', field: 'sprint_number' });
|
|
44
48
|
}
|
|
45
49
|
validateSkillFields(card, errors, knownSkillIds);
|
|
46
50
|
// Rule 1: score_label matches computeScoreLabel(score, par)
|
|
47
|
-
if (typeof
|
|
48
|
-
const expected = computeScoreLabel(
|
|
49
|
-
if (card.score_label !== expected) {
|
|
51
|
+
if (typeof effectiveScore === 'number' && effectiveScore > 0 && validPar) {
|
|
52
|
+
const expected = computeScoreLabel(effectiveScore, card.par);
|
|
53
|
+
if (card.score_label != null && card.score_label !== expected) {
|
|
50
54
|
errors.push({
|
|
51
55
|
code: 'SCORE_LABEL_MISMATCH',
|
|
52
|
-
message: `score_label "${card.score_label}" doesn't match computed "${expected}" (score=${
|
|
56
|
+
message: `score_label "${card.score_label}" doesn't match computed "${expected}" (score=${effectiveScore}, par=${card.par})`,
|
|
53
57
|
field: 'score_label',
|
|
54
58
|
});
|
|
55
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyB9C,kBAAkB;AAElB,MAAM,YAAY,GAAwD;IACxE,WAAW,EAAE,MAAM;IACnB,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,MAAM;IACnB,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAa,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9E,MAAM,sBAAsB,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,CAAU,CAAC;AAClH,MAAM,iBAAiB,GAAG,CAAC,kBAAkB,CAAU,CAAC;AAExD,SAAS,cAAc,CAAC,CAAS;IAC/B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,yBAAyB;AAEzB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slope-dev/slope",
|
|
3
|
-
"version": "1.57.
|
|
3
|
+
"version": "1.57.1",
|
|
4
4
|
"description": "Quantified sprint metrics for AI-assisted development. Scorecards, handicap tracking, and real-time agent guidance for Claude Code, Cursor, Windsurf, Cline, and OpenCode.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -56,6 +56,9 @@ function inSprintPhase(cwd) {
|
|
|
56
56
|
const phase = readSprintPhase(cwd);
|
|
57
57
|
return phase === 'planning' || phase === 'implementing' || phase === 'scoring';
|
|
58
58
|
}
|
|
59
|
+
function isGitCommitCommand(command) {
|
|
60
|
+
return /(?:^|[;&|]\s*)git\s+commit(?:\s|$)/.test(command);
|
|
61
|
+
}
|
|
59
62
|
function hasRecentPlan(ctx) {
|
|
60
63
|
const entries = ctx.sessionManager.getEntries();
|
|
61
64
|
// Scan last 5 assistant messages for a structured plan.
|
|
@@ -413,7 +416,7 @@ export default function slopeExtension(pi, _cwdOverride) {
|
|
|
413
416
|
catch { /* guard failure should never block */ }
|
|
414
417
|
}
|
|
415
418
|
// Commit discipline: warn on direct main/master commits
|
|
416
|
-
if (toolName === 'bash' && typeof inp.command === 'string' &&
|
|
419
|
+
if (toolName === 'bash' && typeof inp.command === 'string' && isGitCommitCommand(inp.command)) {
|
|
417
420
|
try {
|
|
418
421
|
const branch = execSync('git rev-parse --abbrev-ref HEAD', { cwd: ctx.cwd, encoding: 'utf8' }).trim();
|
|
419
422
|
if (branch === 'main' || branch === 'master') {
|