@slope-dev/slope 1.57.2 → 1.58.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/dist/cli/atomic-write.d.ts.map +1 -1
- package/dist/cli/atomic-write.js +12 -3
- package/dist/cli/atomic-write.js.map +1 -1
- package/dist/cli/commands/auto-card.d.ts.map +1 -1
- package/dist/cli/commands/auto-card.js +27 -7
- package/dist/cli/commands/auto-card.js.map +1 -1
- package/dist/cli/commands/commit-ready.d.ts.map +1 -1
- package/dist/cli/commands/commit-ready.js +19 -33
- package/dist/cli/commands/commit-ready.js.map +1 -1
- package/dist/cli/commands/enrich.js +4 -4
- package/dist/cli/commands/enrich.js.map +1 -1
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +2 -1
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/issue.d.ts +2 -0
- package/dist/cli/commands/issue.d.ts.map +1 -0
- package/dist/cli/commands/issue.js +548 -0
- package/dist/cli/commands/issue.js.map +1 -0
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +127 -19
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/pr.d.ts +1 -1
- package/dist/cli/commands/pr.d.ts.map +1 -1
- package/dist/cli/commands/pr.js +19 -7
- package/dist/cli/commands/pr.js.map +1 -1
- package/dist/cli/commands/resume.d.ts +2 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +5 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/retro.d.ts +2 -1
- package/dist/cli/commands/retro.d.ts.map +1 -1
- package/dist/cli/commands/retro.js +243 -4
- package/dist/cli/commands/retro.js.map +1 -1
- package/dist/cli/commands/review.d.ts +1 -1
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +13 -5
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +17 -0
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +302 -59
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +18 -9
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/store.d.ts.map +1 -1
- package/dist/cli/commands/store.js +10 -0
- package/dist/cli/commands/store.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +32 -3
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/version.d.ts.map +1 -1
- package/dist/cli/commands/version.js +15 -8
- 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 +9 -7
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/guards/branch-before-commit.d.ts.map +1 -1
- package/dist/cli/guards/branch-before-commit.js +2 -1
- package/dist/cli/guards/branch-before-commit.js.map +1 -1
- package/dist/cli/guards/claim-required.d.ts.map +1 -1
- package/dist/cli/guards/claim-required.js +26 -15
- package/dist/cli/guards/claim-required.js.map +1 -1
- package/dist/cli/guards/commit-nudge.d.ts.map +1 -1
- package/dist/cli/guards/commit-nudge.js +6 -5
- package/dist/cli/guards/commit-nudge.js.map +1 -1
- package/dist/cli/guards/compaction.d.ts.map +1 -1
- package/dist/cli/guards/compaction.js +6 -5
- package/dist/cli/guards/compaction.js.map +1 -1
- package/dist/cli/guards/docs.js +3 -3
- package/dist/cli/guards/docs.js.map +1 -1
- package/dist/cli/guards/explore.d.ts.map +1 -1
- package/dist/cli/guards/explore.js +6 -2
- package/dist/cli/guards/explore.js.map +1 -1
- package/dist/cli/guards/git-utils.js +3 -3
- 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 +7 -2
- package/dist/cli/guards/hazard.js.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.d.ts.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.js +22 -2
- 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 +15 -10
- package/dist/cli/guards/post-push.js.map +1 -1
- package/dist/cli/guards/pr-review.d.ts.map +1 -1
- package/dist/cli/guards/pr-review.js +1 -0
- package/dist/cli/guards/pr-review.js.map +1 -1
- package/dist/cli/guards/push-nudge.d.ts.map +1 -1
- package/dist/cli/guards/push-nudge.js +4 -3
- package/dist/cli/guards/push-nudge.js.map +1 -1
- package/dist/cli/guards/scope-drift.js +2 -0
- package/dist/cli/guards/scope-drift.js.map +1 -1
- package/dist/cli/guards/sprint-completion.d.ts.map +1 -1
- package/dist/cli/guards/sprint-completion.js +222 -21
- 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 +14 -12
- package/dist/cli/guards/stop-check.js.map +1 -1
- package/dist/cli/guards/version-check.d.ts.map +1 -1
- package/dist/cli/guards/version-check.js +3 -1
- package/dist/cli/guards/version-check.js.map +1 -1
- package/dist/cli/guards/workflow-step-gate.d.ts.map +1 -1
- package/dist/cli/guards/workflow-step-gate.js +14 -3
- 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 +138 -8
- package/dist/cli/guards/worktree-check.js.map +1 -1
- package/dist/cli/guards/worktree-merge.d.ts.map +1 -1
- package/dist/cli/guards/worktree-merge.js +3 -2
- package/dist/cli/guards/worktree-merge.js.map +1 -1
- package/dist/cli/guards/worktree-reuse.d.ts.map +1 -1
- package/dist/cli/guards/worktree-reuse.js +41 -12
- package/dist/cli/guards/worktree-reuse.js.map +1 -1
- package/dist/cli/guards/worktree-self-remove.d.ts.map +1 -1
- package/dist/cli/guards/worktree-self-remove.js +3 -2
- package/dist/cli/guards/worktree-self-remove.js.map +1 -1
- package/dist/cli/index.js +24 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loop/slope-executor.d.ts.map +1 -1
- package/dist/cli/loop/slope-executor.js +4 -2
- package/dist/cli/loop/slope-executor.js.map +1 -1
- package/dist/cli/pr-closeout.d.ts +28 -0
- package/dist/cli/pr-closeout.d.ts.map +1 -1
- package/dist/cli/pr-closeout.js +297 -8
- package/dist/cli/pr-closeout.js.map +1 -1
- package/dist/cli/pr-review-state.d.ts +15 -0
- package/dist/cli/pr-review-state.d.ts.map +1 -1
- package/dist/cli/pr-review-state.js +68 -0
- package/dist/cli/pr-review-state.js.map +1 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +52 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/source-runtime.d.ts +9 -0
- package/dist/cli/source-runtime.d.ts.map +1 -0
- package/dist/cli/source-runtime.js +50 -0
- package/dist/cli/source-runtime.js.map +1 -0
- package/dist/cli/sprint-resume.d.ts +55 -0
- package/dist/cli/sprint-resume.d.ts.map +1 -0
- package/dist/cli/sprint-resume.js +213 -0
- package/dist/cli/sprint-resume.js.map +1 -0
- package/dist/cli/template-generator.d.ts.map +1 -1
- package/dist/cli/template-generator.js +10 -2
- package/dist/cli/template-generator.js.map +1 -1
- package/dist/cli/workflow-resync.d.ts +37 -0
- package/dist/cli/workflow-resync.d.ts.map +1 -0
- package/dist/cli/workflow-resync.js +273 -0
- package/dist/cli/workflow-resync.js.map +1 -0
- package/dist/core/analyzers/walk.d.ts.map +1 -1
- package/dist/core/analyzers/walk.js +4 -1
- package/dist/core/analyzers/walk.js.map +1 -1
- package/dist/core/briefing.d.ts.map +1 -1
- package/dist/core/briefing.js +17 -5
- package/dist/core/briefing.js.map +1 -1
- package/dist/core/flows.d.ts.map +1 -1
- package/dist/core/flows.js +2 -2
- package/dist/core/flows.js.map +1 -1
- package/dist/core/formatter.d.ts.map +1 -1
- package/dist/core/formatter.js +3 -48
- package/dist/core/formatter.js.map +1 -1
- package/dist/core/harness.d.ts +1 -1
- package/dist/core/harness.d.ts.map +1 -1
- package/dist/core/harness.js +7 -5
- package/dist/core/harness.js.map +1 -1
- package/dist/core/imports.d.ts.map +1 -1
- package/dist/core/imports.js +7 -4
- package/dist/core/imports.js.map +1 -1
- package/dist/core/index.d.ts +5 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/interview-engine.d.ts.map +1 -1
- package/dist/core/interview-engine.js +3 -1
- package/dist/core/interview-engine.js.map +1 -1
- package/dist/core/issue-scout.d.ts +70 -0
- package/dist/core/issue-scout.d.ts.map +1 -0
- package/dist/core/issue-scout.js +481 -0
- package/dist/core/issue-scout.js.map +1 -0
- package/dist/core/loader.d.ts +5 -1
- package/dist/core/loader.d.ts.map +1 -1
- package/dist/core/loader.js +102 -4
- package/dist/core/loader.js.map +1 -1
- package/dist/core/memory-types.d.ts +1 -1
- package/dist/core/memory-types.d.ts.map +1 -1
- package/dist/core/memory-validation.js +1 -1
- package/dist/core/memory-validation.js.map +1 -1
- package/dist/core/memory.d.ts.map +1 -1
- package/dist/core/memory.js +5 -0
- package/dist/core/memory.js.map +1 -1
- package/dist/core/prep.d.ts.map +1 -1
- package/dist/core/prep.js +7 -4
- package/dist/core/prep.js.map +1 -1
- package/dist/core/process.d.ts +3 -0
- package/dist/core/process.d.ts.map +1 -0
- package/dist/core/process.js +3 -0
- package/dist/core/process.js.map +1 -0
- package/dist/core/retro.d.ts +49 -0
- package/dist/core/retro.d.ts.map +1 -0
- package/dist/core/retro.js +112 -0
- package/dist/core/retro.js.map +1 -0
- package/dist/core/vision.js +5 -5
- package/dist/core/vision.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +74 -33
- package/dist/mcp/index.js.map +1 -1
- package/package.json +3 -3
- package/templates/codex/plugins/slope/.codex-plugin/plugin.json +4 -3
- package/templates/codex/plugins/slope/skills/slope-retro/SKILL.md +33 -0
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const FINGERPRINT_MARKER = 'slope-issue-scout:fingerprint:';
|
|
3
|
+
const STOP_WORDS = new Set([
|
|
4
|
+
'the', 'and', 'for', 'with', 'that', 'this', 'from', 'into', 'should',
|
|
5
|
+
'slope', 'issue', 'issues', 'when', 'then', 'than', 'after', 'before',
|
|
6
|
+
'during', 'agent', 'agents', 'sprint', 'sprints',
|
|
7
|
+
]);
|
|
8
|
+
const SLOPE_PRODUCT_SIGNALS = [
|
|
9
|
+
/\bslope\b/i,
|
|
10
|
+
/\.slope\b/i,
|
|
11
|
+
/\bscorecard\b/i,
|
|
12
|
+
/\bbriefing\b/i,
|
|
13
|
+
/\bauto-card\b/i,
|
|
14
|
+
/\bclaim\b/i,
|
|
15
|
+
/\bguard\b/i,
|
|
16
|
+
/\bpost-push\b/i,
|
|
17
|
+
/\bcloseout\b/i,
|
|
18
|
+
/\breview\b/i,
|
|
19
|
+
/\bvalidate\b/i,
|
|
20
|
+
/\broadmap\b/i,
|
|
21
|
+
/\btranscript\b/i,
|
|
22
|
+
/\bcommon-issues\b/i,
|
|
23
|
+
/\bNODE_MODULE_VERSION\b/i,
|
|
24
|
+
/\bbetter-sqlite3\b/i,
|
|
25
|
+
];
|
|
26
|
+
const PROBLEM_SIGNALS = [
|
|
27
|
+
/\bfailed?\b/i,
|
|
28
|
+
/\bfailure\b/i,
|
|
29
|
+
/\berror\b/i,
|
|
30
|
+
/\bcrash(?:ed)?\b/i,
|
|
31
|
+
/\bhung\b/i,
|
|
32
|
+
/\bhang(?:s|ing)?\b/i,
|
|
33
|
+
/\bmissing\b/i,
|
|
34
|
+
/\binvalid\b/i,
|
|
35
|
+
/\bnonzero\b/i,
|
|
36
|
+
/\bblocked\b/i,
|
|
37
|
+
/\bworkaround\b/i,
|
|
38
|
+
/\bmanual(?:ly)?\b/i,
|
|
39
|
+
/\bwarning\b/i,
|
|
40
|
+
/\bflood(?:ed|ing)?\b/i,
|
|
41
|
+
/\bstale\b/i,
|
|
42
|
+
/\bdrift\b/i,
|
|
43
|
+
/\bopaque\b/i,
|
|
44
|
+
/\bwrong\b/i,
|
|
45
|
+
/\bregression\b/i,
|
|
46
|
+
/\bbug\b/i,
|
|
47
|
+
];
|
|
48
|
+
const PATTERNS = [
|
|
49
|
+
{
|
|
50
|
+
kind: 'ticket-review-result-normalization',
|
|
51
|
+
title: 'Ticket-style scorecards break review/recommend/amend normalization',
|
|
52
|
+
labels: ['bug', 'agent-dx', 'workflow'],
|
|
53
|
+
summary: 'Ticket-style scorecard miss results can be normalized into a misleading review result.',
|
|
54
|
+
acceptanceCriteria: [
|
|
55
|
+
'Ticket-style scorecards preserve miss results such as short, long, left, and right in review output.',
|
|
56
|
+
'Review/recommend/amend paths normalize both classic shot records and ticket-style shot records consistently.',
|
|
57
|
+
'Regression coverage includes a ticket-style scorecard where a short result must not render as Green.',
|
|
58
|
+
],
|
|
59
|
+
required: [
|
|
60
|
+
/ticket-style|ticket style/i,
|
|
61
|
+
/render(?:ed|s)?[^.\n]{0,80}green[^.\n]{0,80}(short|miss)|short[^.\n]{0,80}render(?:ed|s)?[^.\n]{0,80}green/i,
|
|
62
|
+
/review[^.\n]{0,80}green[^.\n]{0,80}short|review[^.\n]{0,80}short[^.\n]{0,80}green/i,
|
|
63
|
+
],
|
|
64
|
+
signals: [/review/i, /recommend/i, /amend/i, /scorecard/i, /green/i, /\bshort\b/i],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
kind: 'canonical-review-artifact',
|
|
68
|
+
title: 'Sprint review should materialize or verify the canonical review markdown',
|
|
69
|
+
labels: ['bug', 'agent-dx', 'workflow'],
|
|
70
|
+
summary: 'The nominal sprint review command can leave the canonical review markdown missing.',
|
|
71
|
+
acceptanceCriteria: [
|
|
72
|
+
'The closeout path either writes docs/retros/sprint-N-review.md or clearly requires an --output path.',
|
|
73
|
+
'Validation or PR status warns when a scorecard exists without the matching review markdown.',
|
|
74
|
+
'Tests cover the default review command and canonical artifact verification.',
|
|
75
|
+
],
|
|
76
|
+
required: [/review[^.\n]{0,120}(markdown|md|artifact|stdout|materialize|missing)|sprint-\d+-review\.md/i],
|
|
77
|
+
signals: [/slope review/i, /closeout/i, /docs\/retros/i, /stdout/i, /canonical/i],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
kind: 'pr-review-prompts-vs-reviewed',
|
|
81
|
+
title: 'PR review state should not mark prompt generation as reviewed',
|
|
82
|
+
labels: ['bug', 'agent-dx', 'workflow'],
|
|
83
|
+
summary: 'PR closeout state can confuse generated review prompts with completed reviewer work.',
|
|
84
|
+
acceptanceCriteria: [
|
|
85
|
+
'slope pr status does not report PR review: reviewed from prompt generation alone.',
|
|
86
|
+
'slope pr review records a review_pending or prompts_generated state unless reviewer output is present.',
|
|
87
|
+
'Ready for PR closeout requires completed review rounds or explicit waiver metadata.',
|
|
88
|
+
],
|
|
89
|
+
required: [/prompt[^.\n]{0,100}(reviewed|generation)|reviewed[^.\n]{0,100}prompt|PR review:\s*reviewed/i],
|
|
90
|
+
signals: [/slope pr status/i, /slope pr review/i, /review rounds/i, /closeout/i, /waiver/i],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
kind: 'explore-stale-map-warning-flood',
|
|
94
|
+
title: 'Explore/stale-map warnings flood output and can hang briefing across long sprint runs',
|
|
95
|
+
labels: ['bug', 'agent-dx', 'workflow'],
|
|
96
|
+
summary: 'Repeated explore or stale-map warnings can swamp agent output and make briefing/closeout unreliable.',
|
|
97
|
+
acceptanceCriteria: [
|
|
98
|
+
'Explore and stale-map warnings rate-limit identical messages per session or turn.',
|
|
99
|
+
'slope briefing caps, paginates, or summarizes large historical hazard ledgers after useful output.',
|
|
100
|
+
'slope map refuses to overwrite a useful CODEBASE.md with zero-source output unless explicitly forced.',
|
|
101
|
+
'After refresh, the guard stops warning or explains the remaining stale condition with one concrete action.',
|
|
102
|
+
],
|
|
103
|
+
required: [/explore[^.\n]{0,120}(warning|650|flood|loop)|stale-map|briefing[^.\n]{0,120}(hang|hung|time-box|ledger)/i],
|
|
104
|
+
signals: [/slope briefing/i, /slope map/i, /CODEBASE\.md/i, /rate-?limit/i, /warning/i, /hazard ledger/i],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
kind: 'validate-sprint-scope',
|
|
108
|
+
title: 'validate --sprint should isolate the requested sprint result',
|
|
109
|
+
labels: ['bug', 'agent-dx', 'workflow'],
|
|
110
|
+
summary: 'Sprint-specific validation can behave like a historical validation pass and fail on unrelated scorecards.',
|
|
111
|
+
acceptanceCriteria: [
|
|
112
|
+
'slope validate --sprint=N evaluates only the requested scorecard.',
|
|
113
|
+
'Historical invalid scorecards do not make a valid requested sprint fail.',
|
|
114
|
+
'The command output makes the validation scope explicit.',
|
|
115
|
+
'Tests cover a valid requested sprint with invalid historical scorecards and an unknown sprint number.',
|
|
116
|
+
],
|
|
117
|
+
required: [/validate\s+--sprint|--sprint[^.\n]{0,120}(historical|all scorecards|project-wide)/i],
|
|
118
|
+
signals: [/historical/i, /scorecards/i, /nonzero/i, /valid/i, /invalid/i],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
kind: 'sqlite-native-abi-drift',
|
|
122
|
+
title: 'sprint status should detect or recover better-sqlite3 native ABI drift',
|
|
123
|
+
labels: ['bug', 'agent-dx'],
|
|
124
|
+
summary: 'SQLite-backed sprint status commands can fail with opaque native module ABI errors.',
|
|
125
|
+
acceptanceCriteria: [
|
|
126
|
+
'slope sprint status catches stale native binding failures and prints a concrete repair command.',
|
|
127
|
+
'The recovery message names active Node version and NODE_MODULE_VERSION details when available.',
|
|
128
|
+
'A health or status path exercises SQLite-backed commands during sprint start and closeout.',
|
|
129
|
+
'Tests cover stale native module errors for sprint status.',
|
|
130
|
+
],
|
|
131
|
+
required: [/better-sqlite3|NODE_MODULE_VERSION|native ABI|native module/i],
|
|
132
|
+
signals: [/sprint status/i, /sqlite/i, /node/i, /compiled/i, /rebuild/i],
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
function normalizeText(text) {
|
|
136
|
+
return text.toLowerCase().replace(/[^a-z0-9#.\-/]+/g, ' ').replace(/\s+/g, ' ').trim();
|
|
137
|
+
}
|
|
138
|
+
function evidenceText(evidence) {
|
|
139
|
+
const items = Array.isArray(evidence) ? evidence : [evidence];
|
|
140
|
+
return items
|
|
141
|
+
.map(item => [
|
|
142
|
+
item.source,
|
|
143
|
+
item.sourcePath ?? '',
|
|
144
|
+
item.sprint == null ? '' : `S${item.sprint}`,
|
|
145
|
+
item.command ?? '',
|
|
146
|
+
item.quote,
|
|
147
|
+
item.details ? JSON.stringify(item.details) : '',
|
|
148
|
+
].filter(Boolean).join('\n'))
|
|
149
|
+
.join('\n\n');
|
|
150
|
+
}
|
|
151
|
+
function countMatches(text, regexes) {
|
|
152
|
+
return regexes.reduce((count, regex) => count + (regex.test(text) ? 1 : 0), 0);
|
|
153
|
+
}
|
|
154
|
+
function isLikelySlopeProductIssue(text) {
|
|
155
|
+
return countMatches(text, SLOPE_PRODUCT_SIGNALS) >= 2 && countMatches(text, PROBLEM_SIGNALS) >= 1;
|
|
156
|
+
}
|
|
157
|
+
function fallbackTitle(text) {
|
|
158
|
+
const firstLine = text
|
|
159
|
+
.split(/\r?\n/)
|
|
160
|
+
.map(line => line.trim())
|
|
161
|
+
.find(line => line && !isMetadataLine(line)) ?? 'SLOPE workflow issue';
|
|
162
|
+
const cleaned = firstLine
|
|
163
|
+
.replace(/^[-*#\s]+/, '')
|
|
164
|
+
.replace(/^issue:\s*/i, '')
|
|
165
|
+
.replace(/[`*_]+/g, '')
|
|
166
|
+
.replace(/\s+/g, ' ')
|
|
167
|
+
.trim();
|
|
168
|
+
if (!cleaned)
|
|
169
|
+
return 'SLOPE workflow issue needs triage';
|
|
170
|
+
return cleaned.length > 90 ? `${cleaned.slice(0, 87).trim()}...` : cleaned;
|
|
171
|
+
}
|
|
172
|
+
function isMetadataLine(line) {
|
|
173
|
+
const lower = line.toLowerCase();
|
|
174
|
+
const pathLike = !line.includes(' ')
|
|
175
|
+
&& lower.includes('/')
|
|
176
|
+
&& ['.md', '.json', '.jsonl', '.txt', '.log'].some(ext => lower.endsWith(ext));
|
|
177
|
+
const sprintLike = lower.startsWith('s') && Number.isFinite(Number(lower.slice(1)));
|
|
178
|
+
return pathLike
|
|
179
|
+
|| sprintLike
|
|
180
|
+
|| line.startsWith('slope ')
|
|
181
|
+
|| line.startsWith('{');
|
|
182
|
+
}
|
|
183
|
+
export function classifySlopeIssue(input) {
|
|
184
|
+
const text = typeof input === 'string' ? input : evidenceText(input);
|
|
185
|
+
let best = null;
|
|
186
|
+
for (const pattern of PATTERNS) {
|
|
187
|
+
const requiredHits = countMatches(text, pattern.required);
|
|
188
|
+
if (requiredHits === 0)
|
|
189
|
+
continue;
|
|
190
|
+
const signalHits = countMatches(text, pattern.signals);
|
|
191
|
+
const score = requiredHits * 3 + signalHits;
|
|
192
|
+
if (!best || score > best.score) {
|
|
193
|
+
best = { pattern, score, requiredHits, signalHits };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (best) {
|
|
197
|
+
const confidence = Math.min(0.95, 0.7 + best.signalHits * 0.04 + best.requiredHits * 0.05);
|
|
198
|
+
return {
|
|
199
|
+
slopeDriven: true,
|
|
200
|
+
kind: best.pattern.kind,
|
|
201
|
+
title: best.pattern.title,
|
|
202
|
+
labels: best.pattern.labels,
|
|
203
|
+
confidence: Number(confidence.toFixed(2)),
|
|
204
|
+
summary: best.pattern.summary,
|
|
205
|
+
acceptanceCriteria: best.pattern.acceptanceCriteria,
|
|
206
|
+
reasons: [`matched ${best.pattern.kind}`, `${best.signalHits} supporting signal(s)`],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (isLikelySlopeProductIssue(text)) {
|
|
210
|
+
return {
|
|
211
|
+
slopeDriven: true,
|
|
212
|
+
kind: 'slope-workflow-follow-up',
|
|
213
|
+
title: fallbackTitle(text),
|
|
214
|
+
labels: ['agent-dx', 'workflow'],
|
|
215
|
+
confidence: 0.55,
|
|
216
|
+
summary: 'The evidence appears to describe a SLOPE product or workflow issue that needs human triage.',
|
|
217
|
+
acceptanceCriteria: [
|
|
218
|
+
'Reproduce the workflow failure from the captured evidence.',
|
|
219
|
+
'Decide whether the fix belongs in SLOPE product code, docs, or guard configuration.',
|
|
220
|
+
'Add focused regression coverage or a documented manual verification path.',
|
|
221
|
+
],
|
|
222
|
+
reasons: ['multiple SLOPE product signals found'],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
slopeDriven: false,
|
|
227
|
+
kind: 'not-slope-driven',
|
|
228
|
+
title: 'Not a SLOPE product issue',
|
|
229
|
+
labels: [],
|
|
230
|
+
confidence: 0,
|
|
231
|
+
summary: 'Evidence does not contain enough SLOPE product signals.',
|
|
232
|
+
acceptanceCriteria: [],
|
|
233
|
+
reasons: ['insufficient SLOPE product signals'],
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function stableFingerprint(kind, title) {
|
|
237
|
+
const payload = JSON.stringify({ kind, title: normalizeText(title) });
|
|
238
|
+
return createHash('sha256').update(payload).digest('hex').slice(0, 16);
|
|
239
|
+
}
|
|
240
|
+
export function fingerprintCandidate(candidate) {
|
|
241
|
+
return stableFingerprint(candidate.kind, candidate.title);
|
|
242
|
+
}
|
|
243
|
+
export function buildIssueCandidate(evidence) {
|
|
244
|
+
const evidenceItems = Array.isArray(evidence) ? evidence : [evidence];
|
|
245
|
+
const classification = classifySlopeIssue(evidenceItems);
|
|
246
|
+
if (!classification.slopeDriven)
|
|
247
|
+
return null;
|
|
248
|
+
const candidate = {
|
|
249
|
+
kind: classification.kind,
|
|
250
|
+
title: classification.title,
|
|
251
|
+
labels: [...classification.labels],
|
|
252
|
+
confidence: classification.confidence,
|
|
253
|
+
summary: classification.summary,
|
|
254
|
+
acceptanceCriteria: [...classification.acceptanceCriteria],
|
|
255
|
+
evidence: evidenceItems,
|
|
256
|
+
fingerprint: '',
|
|
257
|
+
};
|
|
258
|
+
candidate.fingerprint = fingerprintCandidate(candidate);
|
|
259
|
+
return candidate;
|
|
260
|
+
}
|
|
261
|
+
export function buildIssueCandidates(evidence) {
|
|
262
|
+
const byKind = new Map();
|
|
263
|
+
for (const item of evidence) {
|
|
264
|
+
const candidate = buildIssueCandidate(item);
|
|
265
|
+
if (!candidate)
|
|
266
|
+
continue;
|
|
267
|
+
const existing = byKind.get(candidate.kind);
|
|
268
|
+
if (!existing) {
|
|
269
|
+
byKind.set(candidate.kind, candidate);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
existing.confidence = Math.max(existing.confidence, candidate.confidence);
|
|
273
|
+
existing.evidence.push(...candidate.evidence);
|
|
274
|
+
existing.labels = Array.from(new Set([...existing.labels, ...candidate.labels]));
|
|
275
|
+
}
|
|
276
|
+
return Array.from(byKind.values()).sort((a, b) => b.confidence - a.confidence || a.title.localeCompare(b.title));
|
|
277
|
+
}
|
|
278
|
+
function tokens(text) {
|
|
279
|
+
return new Set(normalizeText(text)
|
|
280
|
+
.split(' ')
|
|
281
|
+
.filter(token => token.length > 2 && !STOP_WORDS.has(token)));
|
|
282
|
+
}
|
|
283
|
+
function titleSimilarity(a, b) {
|
|
284
|
+
const aTokens = tokens(a);
|
|
285
|
+
const bTokens = tokens(b);
|
|
286
|
+
if (aTokens.size === 0 || bTokens.size === 0)
|
|
287
|
+
return 0;
|
|
288
|
+
let intersection = 0;
|
|
289
|
+
for (const token of aTokens) {
|
|
290
|
+
if (bTokens.has(token))
|
|
291
|
+
intersection++;
|
|
292
|
+
}
|
|
293
|
+
return intersection / Math.min(aTokens.size, bTokens.size);
|
|
294
|
+
}
|
|
295
|
+
function bodyHasFingerprint(issue, fingerprint) {
|
|
296
|
+
return (issue.body ?? '').includes(`${FINGERPRINT_MARKER}${fingerprint}`);
|
|
297
|
+
}
|
|
298
|
+
export function dedupeCandidates(candidates, existingIssues) {
|
|
299
|
+
return candidates.map(candidate => {
|
|
300
|
+
const fingerprintMatch = existingIssues.find(issue => bodyHasFingerprint(issue, candidate.fingerprint));
|
|
301
|
+
if (fingerprintMatch) {
|
|
302
|
+
return {
|
|
303
|
+
...candidate,
|
|
304
|
+
dedupe: {
|
|
305
|
+
status: 'duplicate',
|
|
306
|
+
reason: 'existing issue body contains the same scout fingerprint',
|
|
307
|
+
matchedIssue: fingerprintMatch,
|
|
308
|
+
similarity: 1,
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
const exactTitle = existingIssues.find(issue => normalizeText(issue.title) === normalizeText(candidate.title));
|
|
313
|
+
if (exactTitle) {
|
|
314
|
+
return {
|
|
315
|
+
...candidate,
|
|
316
|
+
dedupe: {
|
|
317
|
+
status: 'duplicate',
|
|
318
|
+
reason: 'existing issue title matches candidate title',
|
|
319
|
+
matchedIssue: exactTitle,
|
|
320
|
+
similarity: 1,
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
let best = null;
|
|
325
|
+
for (const issue of existingIssues) {
|
|
326
|
+
const similarity = titleSimilarity(candidate.title, issue.title);
|
|
327
|
+
if (!best || similarity > best.similarity)
|
|
328
|
+
best = { issue, similarity };
|
|
329
|
+
}
|
|
330
|
+
if (best && best.similarity >= 0.74) {
|
|
331
|
+
return {
|
|
332
|
+
...candidate,
|
|
333
|
+
dedupe: {
|
|
334
|
+
status: 'duplicate',
|
|
335
|
+
reason: 'existing issue title is highly similar',
|
|
336
|
+
matchedIssue: best.issue,
|
|
337
|
+
similarity: Number(best.similarity.toFixed(2)),
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
...candidate,
|
|
343
|
+
dedupe: {
|
|
344
|
+
status: 'new',
|
|
345
|
+
reason: 'no matching issue found',
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
function cleanOneLine(value) {
|
|
351
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
352
|
+
}
|
|
353
|
+
function truncate(value, max = 420) {
|
|
354
|
+
const cleaned = cleanOneLine(value);
|
|
355
|
+
return cleaned.length > max ? `${cleaned.slice(0, max - 3).trim()}...` : cleaned;
|
|
356
|
+
}
|
|
357
|
+
function formatEvidenceLine(evidence) {
|
|
358
|
+
const parts = [];
|
|
359
|
+
if (evidence.sourcePath)
|
|
360
|
+
parts.push(evidence.sourcePath);
|
|
361
|
+
if (evidence.sprint != null)
|
|
362
|
+
parts.push(`S${evidence.sprint}`);
|
|
363
|
+
if (evidence.command)
|
|
364
|
+
parts.push(`command: ${evidence.command}`);
|
|
365
|
+
const prefix = parts.length > 0 ? `${parts.join(' | ')} - ` : '';
|
|
366
|
+
return `- ${prefix}${truncate(evidence.quote)}`;
|
|
367
|
+
}
|
|
368
|
+
export function formatIssueBody(candidate) {
|
|
369
|
+
const lines = [
|
|
370
|
+
'## Summary',
|
|
371
|
+
'',
|
|
372
|
+
candidate.summary,
|
|
373
|
+
'',
|
|
374
|
+
'## Evidence',
|
|
375
|
+
'',
|
|
376
|
+
];
|
|
377
|
+
for (const item of candidate.evidence.slice(0, 8)) {
|
|
378
|
+
lines.push(formatEvidenceLine(item));
|
|
379
|
+
}
|
|
380
|
+
if (candidate.evidence.length > 8) {
|
|
381
|
+
lines.push(`- ${candidate.evidence.length - 8} additional evidence item(s) omitted from this issue body.`);
|
|
382
|
+
}
|
|
383
|
+
lines.push('', '## Acceptance Criteria', '');
|
|
384
|
+
for (const criterion of candidate.acceptanceCriteria) {
|
|
385
|
+
lines.push(`- ${criterion}`);
|
|
386
|
+
}
|
|
387
|
+
lines.push('', '## Scout Metadata', '', `- confidence: ${candidate.confidence.toFixed(2)}`, `- labels: ${candidate.labels.join(', ')}`, `- ${FINGERPRINT_MARKER}${candidate.fingerprint}`);
|
|
388
|
+
return `${lines.join('\n')}\n`;
|
|
389
|
+
}
|
|
390
|
+
export function formatIssueScoutComment(candidate) {
|
|
391
|
+
const lines = [
|
|
392
|
+
'## Additional SLOPE Issue Scout Evidence',
|
|
393
|
+
'',
|
|
394
|
+
`The scout found more evidence for this issue with confidence ${candidate.confidence.toFixed(2)}.`,
|
|
395
|
+
'',
|
|
396
|
+
'## Evidence',
|
|
397
|
+
'',
|
|
398
|
+
...candidate.evidence.slice(0, 8).map(formatEvidenceLine),
|
|
399
|
+
'',
|
|
400
|
+
'## Scout Metadata',
|
|
401
|
+
'',
|
|
402
|
+
`- ${FINGERPRINT_MARKER}${candidate.fingerprint}`,
|
|
403
|
+
];
|
|
404
|
+
return `${lines.join('\n')}\n`;
|
|
405
|
+
}
|
|
406
|
+
export function renderIssueScoutDigest(candidates, opts = {}) {
|
|
407
|
+
const generatedAt = opts.generatedAt ?? new Date().toISOString();
|
|
408
|
+
const lines = [
|
|
409
|
+
'# SLOPE Issue Scout Daily Digest',
|
|
410
|
+
'',
|
|
411
|
+
`Generated: ${generatedAt}`,
|
|
412
|
+
];
|
|
413
|
+
if (opts.repo)
|
|
414
|
+
lines.push(`Repository: ${opts.repo}`);
|
|
415
|
+
const newCandidates = candidates.filter(c => c.dedupe?.status !== 'duplicate');
|
|
416
|
+
const duplicates = candidates.filter(c => c.dedupe?.status === 'duplicate');
|
|
417
|
+
lines.push('', '## Request Approval To Fix', '');
|
|
418
|
+
if (newCandidates.length === 0) {
|
|
419
|
+
lines.push('No new SLOPE-driven issue candidates need approval today.');
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
for (const candidate of newCandidates) {
|
|
423
|
+
lines.push(`- ${candidate.title}`);
|
|
424
|
+
lines.push(` - confidence: ${candidate.confidence.toFixed(2)}`);
|
|
425
|
+
lines.push(` - labels: ${candidate.labels.join(', ')}`);
|
|
426
|
+
lines.push(` - fingerprint: ${candidate.fingerprint}`);
|
|
427
|
+
lines.push(' - requested decision: approve fix, defer, or reject');
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (duplicates.length > 0) {
|
|
431
|
+
lines.push('', '## Existing Or Duplicate Candidates', '');
|
|
432
|
+
for (const candidate of duplicates) {
|
|
433
|
+
const issue = candidate.dedupe?.matchedIssue;
|
|
434
|
+
const ref = issue ? `#${issue.number}${issue.state ? ` (${issue.state})` : ''}` : 'existing issue';
|
|
435
|
+
lines.push(`- ${candidate.title} -> ${ref}`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return `${lines.join('\n')}\n`;
|
|
439
|
+
}
|
|
440
|
+
export function parseIssueScoutState(raw) {
|
|
441
|
+
try {
|
|
442
|
+
const parsed = JSON.parse(raw);
|
|
443
|
+
return {
|
|
444
|
+
version: 1,
|
|
445
|
+
records: Array.isArray(parsed.records) ? parsed.records.filter(isStateRecord) : [],
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
return { version: 1, records: [] };
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
function isStateRecord(value) {
|
|
453
|
+
if (typeof value !== 'object' || value === null)
|
|
454
|
+
return false;
|
|
455
|
+
const record = value;
|
|
456
|
+
return typeof record.fingerprint === 'string'
|
|
457
|
+
&& typeof record.title === 'string'
|
|
458
|
+
&& typeof record.status === 'string'
|
|
459
|
+
&& typeof record.updatedAt === 'string';
|
|
460
|
+
}
|
|
461
|
+
export function mergeIssueScoutState(state, records) {
|
|
462
|
+
const merged = new Map();
|
|
463
|
+
for (const record of state.records)
|
|
464
|
+
merged.set(record.fingerprint, record);
|
|
465
|
+
for (const record of records) {
|
|
466
|
+
const existing = merged.get(record.fingerprint);
|
|
467
|
+
merged.set(record.fingerprint, {
|
|
468
|
+
...existing,
|
|
469
|
+
...record,
|
|
470
|
+
sourcePaths: Array.from(new Set([
|
|
471
|
+
...(existing?.sourcePaths ?? []),
|
|
472
|
+
...(record.sourcePaths ?? []),
|
|
473
|
+
])).sort(),
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
return {
|
|
477
|
+
version: 1,
|
|
478
|
+
records: Array.from(merged.values()).sort((a, b) => a.title.localeCompare(b.title)),
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=issue-scout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-scout.js","sourceRoot":"","sources":["../../src/core/issue-scout.ts"],"names":[],"mappings":"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"}
|
package/dist/core/loader.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GolfScorecard } from './types.js';
|
|
1
|
+
import type { GolfScorecard, ShotRecord } from './types.js';
|
|
2
2
|
import type { SlopeConfig } from './config.js';
|
|
3
3
|
/**
|
|
4
4
|
* Load SLOPE scorecards from the configured directory.
|
|
@@ -6,6 +6,7 @@ import type { SlopeConfig } from './config.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare function loadScorecards(config: SlopeConfig, cwd?: string): GolfScorecard[];
|
|
8
8
|
export declare function discoverScorecardFiles(config: SlopeConfig, cwd?: string): string[];
|
|
9
|
+
export declare function sprintNumberFromScorecardFile(file: string, config: SlopeConfig): number | null;
|
|
9
10
|
/**
|
|
10
11
|
* Detect the latest sprint number from existing scorecards.
|
|
11
12
|
* Returns 0 if no scorecards are found.
|
|
@@ -20,4 +21,7 @@ export declare function resolveCurrentSprint(config: SlopeConfig, cwd?: string):
|
|
|
20
21
|
* Handles legacy `hole_stats` → `stats` and `sprint` → `sprint_number`.
|
|
21
22
|
*/
|
|
22
23
|
export declare function normalizeScorecard(raw: Record<string, unknown>): GolfScorecard;
|
|
24
|
+
export declare function normalizeScorecardShots(card: Record<string, unknown> | (Partial<GolfScorecard> & {
|
|
25
|
+
tickets?: unknown[];
|
|
26
|
+
})): ShotRecord[];
|
|
23
27
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,aAAa,EAAa,UAAU,EAAc,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8B/C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,aAAa,EAAE,CAoBhG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAEjG;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAe9F;AAiCD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAO3F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAI7F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAoC9E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,GAAG,UAAU,EAAE,CA8BxI"}
|