@slope-dev/slope 1.56.2 → 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.
Files changed (65) hide show
  1. package/dist/cli/commands/briefing.d.ts.map +1 -1
  2. package/dist/cli/commands/briefing.js +17 -0
  3. package/dist/cli/commands/briefing.js.map +1 -1
  4. package/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/dist/cli/commands/doctor.js +6 -2
  6. package/dist/cli/commands/doctor.js.map +1 -1
  7. package/dist/cli/commands/guard.d.ts +1 -0
  8. package/dist/cli/commands/guard.d.ts.map +1 -1
  9. package/dist/cli/commands/guard.js +345 -21
  10. package/dist/cli/commands/guard.js.map +1 -1
  11. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  12. package/dist/cli/commands/roadmap.js +6 -0
  13. package/dist/cli/commands/roadmap.js.map +1 -1
  14. package/dist/cli/commands/sprint.d.ts.map +1 -1
  15. package/dist/cli/commands/sprint.js +63 -4
  16. package/dist/cli/commands/sprint.js.map +1 -1
  17. package/dist/cli/commands/validate.d.ts.map +1 -1
  18. package/dist/cli/commands/validate.js +3 -27
  19. package/dist/cli/commands/validate.js.map +1 -1
  20. package/dist/cli/commands/worktree.d.ts.map +1 -1
  21. package/dist/cli/commands/worktree.js +23 -0
  22. package/dist/cli/commands/worktree.js.map +1 -1
  23. package/dist/cli/error-reporter.d.ts +3 -0
  24. package/dist/cli/error-reporter.d.ts.map +1 -0
  25. package/dist/cli/error-reporter.js +20 -0
  26. package/dist/cli/error-reporter.js.map +1 -0
  27. package/dist/cli/guards/branch-before-commit.js +1 -1
  28. package/dist/cli/guards/branch-before-commit.js.map +1 -1
  29. package/dist/cli/guards/commit-nudge.js +1 -1
  30. package/dist/cli/guards/commit-nudge.js.map +1 -1
  31. package/dist/cli/guards/compaction.js +1 -1
  32. package/dist/cli/guards/compaction.js.map +1 -1
  33. package/dist/cli/guards/push-nudge.d.ts.map +1 -1
  34. package/dist/cli/guards/push-nudge.js +5 -2
  35. package/dist/cli/guards/push-nudge.js.map +1 -1
  36. package/dist/cli/guards/subagent-gate.d.ts +1 -1
  37. package/dist/cli/guards/subagent-gate.d.ts.map +1 -1
  38. package/dist/cli/guards/subagent-gate.js +3 -3
  39. package/dist/cli/guards/subagent-gate.js.map +1 -1
  40. package/dist/cli/guards/transcript.js +1 -1
  41. package/dist/cli/guards/transcript.js.map +1 -1
  42. package/dist/cli/index.js +55 -213
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/cli/pre-sprint-reality.d.ts +33 -0
  45. package/dist/cli/pre-sprint-reality.d.ts.map +1 -0
  46. package/dist/cli/pre-sprint-reality.js +253 -0
  47. package/dist/cli/pre-sprint-reality.js.map +1 -0
  48. package/dist/cli/registry.d.ts.map +1 -1
  49. package/dist/cli/registry.js +6 -0
  50. package/dist/cli/registry.js.map +1 -1
  51. package/dist/core/index.d.ts +1 -1
  52. package/dist/core/index.d.ts.map +1 -1
  53. package/dist/core/index.js +1 -1
  54. package/dist/core/index.js.map +1 -1
  55. package/dist/core/loader.d.ts +1 -0
  56. package/dist/core/loader.d.ts.map +1 -1
  57. package/dist/core/loader.js +80 -22
  58. package/dist/core/loader.js.map +1 -1
  59. package/dist/core/validation.d.ts +2 -0
  60. package/dist/core/validation.d.ts.map +1 -1
  61. package/dist/core/validation.js +12 -8
  62. package/dist/core/validation.js.map +1 -1
  63. package/package.json +1 -1
  64. package/packages/pi-extension/dist/index.js +4 -1
  65. package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
@@ -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 files = readdirSync(dir)
20
- .filter((f) => regex.test(f))
44
+ const candidates = discoverScorecardCandidates(dir, regex)
45
+ .filter((candidate) => candidate.sprintNumber >= config.minSprint)
21
46
  .sort((a, b) => {
22
- const na = parseFloat(a.match(regex)?.[1] ?? '0');
23
- const nb = parseFloat(b.match(regex)?.[1] ?? '0');
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 scorecards = [];
27
- for (const file of files) {
28
- const match = file.match(regex);
29
- if (!match)
50
+ const loadedSprints = new Set();
51
+ const dedupedCandidates = [];
52
+ for (const candidate of candidates) {
53
+ if (loadedSprints.has(candidate.sprintNumber))
30
54
  continue;
31
- const num = parseFloat(match[1]);
32
- if (num < config.minSprint)
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 scorecards;
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
@@ -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;AAEvE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,qFAAqF;IACrF,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,qBAAqB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE7F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAClD,OAAO,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAoB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS;YAAE,SAAS;QAErC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,YAAY,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACjF,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;SAC3B,IAAI,CAAC,gBAAgB,CAAC;SACtB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACnF,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC,aAAa,CAAC;IACtD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAA4B;IAC7D,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAA6B,CAAC;IAEnD,0BAA0B;IAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC;IAEvD,0EAA0E;IAC1E,MAAM,SAAS,GAAI,IAAI,CAAC,KAAmB,EAAE,MAAM,IAAI,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,qFAAqF;QACrF,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,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,EACzC,OAAO,GAAE,0BAA+B,GACvC,yBAAyB,CAyI3B"}
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"}
@@ -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 (![3, 4, 5].includes(card.par)) {
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 card.score !== 'number' || card.score <= 0) {
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 (!card.date || !isValidISODate(card.date)) {
40
- errors.push({ code: 'INVALID_DATE', message: `date must be a valid ISO string (got "${card.date}")`, field: 'date' });
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 card.score === 'number' && card.score > 0 && [3, 4, 5].includes(card.par)) {
48
- const expected = computeScoreLabel(card.score, card.par);
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=${card.score}, par=${card.par})`,
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":"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"}
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,IAAqF,EACrF,UAAsC,EAAE;IAExC,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAiC,EAAE,CAAC;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa;QACzC,CAAC,CAAC,OAAO,CAAC,aAAa,YAAY,GAAG;YACpC,CAAC,CAAC,OAAO,CAAC,aAAa;YACvB,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC;IAET,kFAAkF;IAClF,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC;IACvD,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC;IAExE,iCAAiC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,+BAA+B,IAAI,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,0BAA0B,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yCAAyC,aAAa,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5H,CAAC;IACD,IAAI,YAAY,IAAI,IAAI,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uDAAuD,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;IACpI,CAAC;IAED,mBAAmB,CAAC,IAA0C,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAEvF,4DAA4D;IAC5D,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,gBAAgB,IAAI,CAAC,WAAW,6BAA6B,QAAQ,YAAY,cAAc,SAAS,IAAI,CAAC,GAAG,GAAG;gBAC5H,KAAK,EAAE,aAAa;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,iBAAiB,KAAK,CAAC,YAAY,uBAAuB,KAAK,CAAC,cAAc,GAAG;gBAC1F,KAAK,EAAE,oBAAoB;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,oBAAoB,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,yBAAyB,KAAK,CAAC,oBAAoB,qBAAqB,KAAK,CAAC,YAAY,GAAG;gBACtG,KAAK,EAAE,4BAA4B;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,iBAAiB,IAAI,CAAC,KAAK,CAAC,MAAM,yCAAyC,KAAK,CAAC,cAAc,GAAG;gBAC3G,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,sBAAsB,KAAK,CAAC,WAAW,6CAA6C,YAAY,GAAG;gBAC5G,KAAK,EAAE,mBAAmB;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,MAAM,gBAAgB,GAAgB,IAAI,GAAG,CAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAClG,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtE,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,yBAAyB;wBAC/B,OAAO,EAAE,oBAAoB,MAAM,CAAC,QAAQ,yDAAyD;wBACrG,KAAK,EAAE,4BAA4B;qBACpC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,GAAG,EAAE,CAAC;gBACR,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,mBAAmB,GAAG,OAAO,MAAM,QAAQ,QAAQ,qBAAqB,GAAG,SAAS;oBAC7F,KAAK,EAAE,yBAAyB,GAAG,EAAE;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,0DAA0D,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,2EAA2E,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAA6B,EAC7B,MAAkC,EAClC,aAAiC;IAEjC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,sBAAsB,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,IAAI,IAAI;YAAE,SAAS;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,GAAG,KAAK,8BAA8B;gBAC/C,KAAK;aACN,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,GAAG,KAAK,sCAAsC;oBACvD,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,SAAS;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACrE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,GAAG,KAAK,8BAA8B,KAAK,GAAG;oBACvD,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slope-dev/slope",
3
- "version": "1.56.2",
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' && /git\s+commit/.test(inp.command)) {
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') {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slope",
3
- "version": "1.56.2",
3
+ "version": "1.57.1",
4
4
  "description": "SLOPE sprint tracking, guard hooks, and Codex workflow skills.",
5
5
  "author": {
6
6
  "name": "SLOPE",