@slope-dev/slope 1.13.1 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -189
- package/dist/adapters.d.ts +3 -0
- package/dist/adapters.d.ts.map +1 -1
- package/dist/adapters.js +2 -0
- package/dist/adapters.js.map +1 -1
- package/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +190 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/distill.d.ts.map +1 -1
- package/dist/cli/commands/distill.js +13 -4
- package/dist/cli/commands/distill.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts +2 -0
- package/dist/cli/commands/enrich.d.ts.map +1 -0
- package/dist/cli/commands/enrich.js +140 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/guard.d.ts +19 -0
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +87 -1
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/hook.d.ts +1 -0
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +2 -0
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/index-cmd.d.ts +2 -0
- package/dist/cli/commands/index-cmd.d.ts.map +1 -0
- package/dist/cli/commands/index-cmd.js +296 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +204 -145
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/initiative.d.ts +2 -0
- package/dist/cli/commands/initiative.d.ts.map +1 -0
- package/dist/cli/commands/initiative.js +207 -0
- package/dist/cli/commands/initiative.js.map +1 -0
- package/dist/cli/commands/metaphor.d.ts +3 -0
- package/dist/cli/commands/metaphor.d.ts.map +1 -0
- package/dist/cli/commands/metaphor.js +100 -0
- package/dist/cli/commands/metaphor.js.map +1 -0
- package/dist/cli/commands/prep.d.ts +2 -0
- package/dist/cli/commands/prep.d.ts.map +1 -0
- package/dist/cli/commands/prep.js +94 -0
- package/dist/cli/commands/prep.js.map +1 -0
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +83 -44
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/store.d.ts +2 -0
- package/dist/cli/commands/store.d.ts.map +1 -0
- package/dist/cli/commands/store.js +270 -0
- package/dist/cli/commands/store.js.map +1 -0
- package/dist/cli/guards/stop-check.d.ts +1 -1
- package/dist/cli/guards/stop-check.d.ts.map +1 -1
- package/dist/cli/guards/stop-check.js +14 -2
- package/dist/cli/guards/stop-check.js.map +1 -1
- package/dist/cli/index.js +60 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive-init.d.ts +19 -0
- package/dist/cli/interactive-init.d.ts.map +1 -0
- package/dist/cli/interactive-init.js +132 -0
- package/dist/cli/interactive-init.js.map +1 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +8 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/store.d.ts +9 -0
- package/dist/cli/store.d.ts.map +1 -1
- package/dist/cli/store.js +29 -0
- package/dist/cli/store.js.map +1 -1
- package/dist/cli/template-generator.d.ts +1 -1
- package/dist/cli/template-generator.d.ts.map +1 -1
- package/dist/cli/template-generator.js +5 -3
- package/dist/cli/template-generator.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts +3 -0
- package/dist/core/adapters/claude-code.d.ts.map +1 -1
- package/dist/core/adapters/claude-code.js +17 -2
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/cline.d.ts +36 -0
- package/dist/core/adapters/cline.d.ts.map +1 -0
- package/dist/core/adapters/cline.js +279 -0
- package/dist/core/adapters/cline.js.map +1 -0
- package/dist/core/adapters/cursor.d.ts +3 -0
- package/dist/core/adapters/cursor.d.ts.map +1 -1
- package/dist/core/adapters/cursor.js +5 -0
- package/dist/core/adapters/cursor.js.map +1 -1
- package/dist/core/adapters/generic.d.ts +3 -0
- package/dist/core/adapters/generic.d.ts.map +1 -1
- package/dist/core/adapters/generic.js +5 -0
- package/dist/core/adapters/generic.js.map +1 -1
- package/dist/core/adapters/windsurf.d.ts +3 -0
- package/dist/core/adapters/windsurf.d.ts.map +1 -1
- package/dist/core/adapters/windsurf.js +5 -0
- package/dist/core/adapters/windsurf.js.map +1 -1
- package/dist/core/config.d.ts +8 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +9 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/context.d.ts +20 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +59 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/embedding-client.d.ts +11 -0
- package/dist/core/embedding-client.d.ts.map +1 -0
- package/dist/core/embedding-client.js +92 -0
- package/dist/core/embedding-client.js.map +1 -0
- package/dist/core/embedding-store.d.ts +44 -0
- package/dist/core/embedding-store.d.ts.map +1 -0
- package/dist/core/embedding-store.js +7 -0
- package/dist/core/embedding-store.js.map +1 -0
- package/dist/core/embedding.d.ts +32 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +114 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/enrich.d.ts +76 -0
- package/dist/core/enrich.d.ts.map +1 -0
- package/dist/core/enrich.js +115 -0
- package/dist/core/enrich.js.map +1 -0
- package/dist/core/harness.d.ts +6 -0
- package/dist/core/harness.d.ts.map +1 -1
- package/dist/core/harness.js +1 -1
- package/dist/core/harness.js.map +1 -1
- package/dist/core/index.d.ts +30 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +26 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/initiative.d.ts +72 -0
- package/dist/core/initiative.d.ts.map +1 -0
- package/dist/core/initiative.js +421 -0
- package/dist/core/initiative.js.map +1 -0
- package/dist/core/interview-engine.d.ts +34 -0
- package/dist/core/interview-engine.d.ts.map +1 -0
- package/dist/core/interview-engine.js +195 -0
- package/dist/core/interview-engine.js.map +1 -0
- package/dist/core/interview-steps.d.ts +27 -0
- package/dist/core/interview-steps.d.ts.map +1 -0
- package/dist/core/interview-steps.js +157 -0
- package/dist/core/interview-steps.js.map +1 -0
- package/dist/core/interview.d.ts +20 -0
- package/dist/core/interview.d.ts.map +1 -1
- package/dist/core/interview.js +62 -35
- package/dist/core/interview.js.map +1 -1
- package/dist/core/metaphor-preview.d.ts +34 -0
- package/dist/core/metaphor-preview.d.ts.map +1 -0
- package/dist/core/metaphor-preview.js +94 -0
- package/dist/core/metaphor-preview.js.map +1 -0
- package/dist/core/metaphor.d.ts +14 -0
- package/dist/core/metaphor.d.ts.map +1 -1
- package/dist/core/metaphor.js +14 -0
- package/dist/core/metaphor.js.map +1 -1
- package/dist/core/plugins.d.ts +12 -0
- package/dist/core/plugins.d.ts.map +1 -1
- package/dist/core/plugins.js +58 -1
- package/dist/core/plugins.js.map +1 -1
- package/dist/core/prep.d.ts +88 -0
- package/dist/core/prep.d.ts.map +1 -0
- package/dist/core/prep.js +302 -0
- package/dist/core/prep.js.map +1 -0
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +5 -4
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/roles.d.ts +3 -0
- package/dist/core/roles.d.ts.map +1 -1
- package/dist/core/roles.js +36 -0
- package/dist/core/roles.js.map +1 -1
- package/dist/core/store-health.d.ts +11 -0
- package/dist/core/store-health.d.ts.map +1 -0
- package/dist/core/store-health.js +26 -0
- package/dist/core/store-health.js.map +1 -0
- package/dist/core/store.d.ts +11 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +103 -6
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/index.test.js +7 -4
- package/dist/mcp/index.test.js.map +1 -1
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +47 -3
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +18 -1
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/store/index.d.ts +34 -3
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +220 -4
- package/dist/store/index.js.map +1 -1
- package/dist/store-pg/index.d.ts +3 -0
- package/dist/store-pg/index.d.ts.map +1 -1
- package/dist/store-pg/index.js +74 -1
- package/dist/store-pg/index.js.map +1 -1
- package/package.json +14 -7
package/README.md
CHANGED
|
@@ -2,218 +2,162 @@
|
|
|
2
2
|
|
|
3
3
|
**Sprint Lifecycle & Operational Performance Engine**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Replace subjective retrospectives with quantified sprint metrics. Track every ticket's approach, outcome, and hazards — then use rolling analytics to spot patterns and improve over time.
|
|
6
|
+
|
|
7
|
+
## Why SLOPE?
|
|
8
|
+
|
|
9
|
+
- **Quantified retros** — structured scorecards with objective scoring instead of "how did it feel?"
|
|
10
|
+
- **Pattern detection** — rolling handicap windows reveal if you consistently over-engineer, under-scope, or pick the wrong approach
|
|
11
|
+
- **AI agent guidance** — 16 guard hooks give real-time hints to Claude Code, Cursor, Windsurf, Cline, and OpenCode
|
|
12
|
+
- **Pluggable metaphors** — golf, tennis, baseball, gaming, D&D, matrix, or agile terminology — same math, your vocabulary
|
|
13
|
+
- **Zero infrastructure** — SQLite store, CLI-driven, lives in your repo
|
|
6
14
|
|
|
7
15
|
## Quick Start
|
|
8
16
|
|
|
9
17
|
```bash
|
|
10
|
-
# Install
|
|
18
|
+
# Install
|
|
11
19
|
npm install -g @slope-dev/slope
|
|
12
20
|
|
|
13
|
-
#
|
|
14
|
-
npm install @slope-dev/slope
|
|
15
|
-
npx slope init
|
|
16
|
-
|
|
17
|
-
# Initialize in your project (auto-detects your AI tool)
|
|
21
|
+
# Initialize (auto-detects your AI coding tool)
|
|
18
22
|
slope init
|
|
19
23
|
|
|
20
|
-
# Or specify your platform
|
|
21
|
-
slope init --claude-code
|
|
22
|
-
slope init --cursor
|
|
23
|
-
slope init --opencode
|
|
24
|
-
|
|
25
24
|
# View your handicap card
|
|
26
25
|
slope card
|
|
27
|
-
|
|
28
|
-
# Get a pre-sprint briefing
|
|
29
|
-
slope briefing
|
|
30
|
-
|
|
31
|
-
# Generate an HTML performance report
|
|
32
|
-
slope report --html
|
|
33
26
|
```
|
|
34
27
|
|
|
35
|
-
>
|
|
28
|
+
> Installed locally? Use `npx slope` instead.
|
|
36
29
|
|
|
37
|
-
##
|
|
30
|
+
## Core Concepts
|
|
38
31
|
|
|
39
|
-
|
|
32
|
+
Every sprint has a **par** (expected baseline from ticket count: 1–2 → par 3, 3–4 → par 4, 5+ → par 5). Each ticket is a **shot** with an approach complexity (**club**: driver → putter) and an outcome (**result**: in_the_hole → missed). Over time, your **handicap card** shows rolling averages, miss patterns, and trend direction.
|
|
40
33
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
34
|
+
| Concept | What it measures |
|
|
35
|
+
|---------|-----------------|
|
|
36
|
+
| Par | Expected sprint baseline (from ticket count) |
|
|
37
|
+
| Slope | Difficulty modifier (cross-package, migrations, etc.) |
|
|
38
|
+
| Club | Approach complexity (driver = risky, putter = trivial) |
|
|
39
|
+
| Result | Outcome (in_the_hole = perfect, missed_long = over-engineered) |
|
|
40
|
+
| Hazard | Gotchas encountered (bunker, water, rough, trees) |
|
|
41
|
+
| Handicap| Rolling performance trend across sprints |
|
|
49
42
|
|
|
50
|
-
##
|
|
51
|
-
|
|
52
|
-
SLOPE ships with 6 built-in metaphors. The scoring math is identical — only the terminology changes.
|
|
53
|
-
|
|
54
|
-
| Metaphor | Sprint | Ticket | Perfect | Par | Miss |
|
|
55
|
-
|----------|--------|--------|---------|-----|------|
|
|
56
|
-
| **Golf** (default) | Sprint | Shot | Hole-in-One | Par | Missed Long/Short/Left/Right |
|
|
57
|
-
| **Tennis** | Set | Point | Ace | Deuce | Wide/Net/Long/Out |
|
|
58
|
-
| **Baseball** | Inning | At-Bat | Home Run | Single | Foul/Strike/Pop/Ground |
|
|
59
|
-
| **Gaming** | Level | Quest | S-Rank | B-Rank | Over-leveled/Under-leveled/Wrong Path/Side-tracked |
|
|
60
|
-
| **D&D** | Quest | Encounter | Natural 20 | DC Met | Fumble/Misfire/Detour/Distraction |
|
|
61
|
-
| **Matrix** | Simulation | Anomaly | The One | Stable | Overclocked/Underclocked/Drift/Noise |
|
|
43
|
+
## Features
|
|
62
44
|
|
|
63
|
-
|
|
45
|
+
### Scoring & Analysis
|
|
46
|
+
- **Scorecards** — structured JSON retros with shot-by-shot tracking
|
|
47
|
+
- **Handicap card** — rolling windows (last 5, 10, all-time) with trend arrows
|
|
48
|
+
- **Dispersion analysis** — miss pattern heatmaps and area performance
|
|
49
|
+
- **HTML reports** — self-contained visual dashboards with charts
|
|
50
|
+
- **Auto-card** — generate draft scorecards from git commits + CI signals
|
|
51
|
+
|
|
52
|
+
### Planning & Workflow
|
|
53
|
+
- **Briefings** — pre-sprint hazard index, nutrition alerts, filtered gotchas
|
|
54
|
+
- **Sessions & claims** — track who's working on what, detect conflicts
|
|
55
|
+
- **Roadmap tools** — validate dependencies, find critical path, parallel opportunities
|
|
56
|
+
- **Club advisor** — complexity recommendations based on historical performance
|
|
57
|
+
|
|
58
|
+
### AI Agent Guidance
|
|
59
|
+
- **16 guard hooks** — real-time hints injected into agent context
|
|
60
|
+
- **MCP server** — search API functions and execute SLOPE commands from your agent
|
|
61
|
+
- **5 platform adapters** — Claude Code, Cursor, Windsurf, Cline, OpenCode
|
|
62
|
+
- **Codebase map** — auto-generated index for agent navigation
|
|
63
|
+
|
|
64
|
+
### Team & Multi-Developer
|
|
65
|
+
- **Team handicap** — aggregate performance across team members
|
|
66
|
+
- **Leaderboard** — multi-developer performance ranking
|
|
67
|
+
- **Standups** — structured standup reports with handoff tracking
|
|
68
|
+
- **Escalation** — severity-based alerts for blocked work
|
|
69
|
+
|
|
70
|
+
## Platform Compatibility
|
|
71
|
+
|
|
72
|
+
| Platform | Rules | Hooks | MCP | Session Tracking |
|
|
73
|
+
|-------------|-------|-------|-----|------------------|
|
|
74
|
+
| Claude Code | .claude/rules/ | .claude/hooks/ | .mcp.json | Auto (hooks) |
|
|
75
|
+
| Cursor | .cursor/rules/ | .cursor/hooks/ | .cursor/mcp.json | Auto (hooks) |
|
|
76
|
+
| Windsurf | .windsurf/rules/ | .windsurf/hooks/ | .windsurf/mcp.json | Auto (hooks) |
|
|
77
|
+
| Cline | .clinerules/ | .clinerules/hooks/ | Manual setup | Auto (hooks) |
|
|
78
|
+
| OpenCode | AGENTS.md | Plugin | opencode.json | Auto (plugin) |
|
|
64
79
|
|
|
65
|
-
```
|
|
66
|
-
|
|
80
|
+
```bash
|
|
81
|
+
slope init --claude-code # or --cursor, --windsurf, --cline, --opencode, --all
|
|
67
82
|
```
|
|
68
83
|
|
|
69
|
-
|
|
84
|
+
## CLI Quick Reference
|
|
70
85
|
|
|
71
|
-
|
|
86
|
+
### Setup & Config
|
|
72
87
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
88
|
+
| Command | Description |
|
|
89
|
+
|---------|-------------|
|
|
90
|
+
| `slope init` | Initialize SLOPE (auto-detects platform) |
|
|
91
|
+
| `slope init --interactive --smart` | Guided setup with repo analysis |
|
|
92
|
+
| `slope hook add --level=full` | Install all guidance hooks |
|
|
93
|
+
| `slope map` | Generate/update codebase map |
|
|
78
94
|
|
|
79
|
-
### Scoring
|
|
95
|
+
### Scoring
|
|
80
96
|
|
|
81
97
|
| Command | Description |
|
|
82
98
|
|---------|-------------|
|
|
83
|
-
| `slope card` | Display handicap card
|
|
99
|
+
| `slope card` | Display handicap card |
|
|
84
100
|
| `slope validate [path]` | Validate scorecard(s) |
|
|
85
|
-
| `slope review [path]
|
|
86
|
-
| `slope
|
|
87
|
-
| `slope
|
|
88
|
-
| `slope
|
|
89
|
-
| `slope report --html [--output=path] [--metaphor=id]` | Generate HTML performance report |
|
|
90
|
-
| `slope tournament --id=<id> --sprints=N..M` | Build tournament review from sprint range |
|
|
91
|
-
| `slope auto-card --sprint=N [--ci=path]` | Generate scorecard from git + CI signals |
|
|
101
|
+
| `slope review [path]` | Generate sprint review markdown |
|
|
102
|
+
| `slope report --html` | Generate HTML performance report |
|
|
103
|
+
| `slope auto-card --sprint=N` | Generate scorecard from git + CI |
|
|
104
|
+
| `slope dashboard` | Live local performance dashboard |
|
|
92
105
|
|
|
93
|
-
### Planning
|
|
106
|
+
### Planning
|
|
94
107
|
|
|
95
108
|
| Command | Description |
|
|
96
109
|
|---------|-------------|
|
|
97
|
-
| `slope briefing
|
|
110
|
+
| `slope briefing` | Pre-sprint briefing with hazards and gotchas |
|
|
98
111
|
| `slope plan --complexity=<level>` | Club recommendation + training plan |
|
|
99
|
-
| `slope classify --scope=... --modified=... --tests=pass` | Classify a shot from execution trace |
|
|
100
112
|
| `slope next` | Show next sprint number |
|
|
101
|
-
| `slope roadmap validate
|
|
102
|
-
|
|
103
|
-
### Sessions & Claims
|
|
104
|
-
|
|
105
|
-
| Command | Description |
|
|
106
|
-
|---------|-------------|
|
|
107
|
-
| `slope session start\|end\|heartbeat\|list` | Manage live sessions |
|
|
108
|
-
| `slope claim --target=<t> [--scope=area] [--force]` | Claim a ticket or area |
|
|
109
|
-
| `slope release --id=<id>` | Release a claim |
|
|
110
|
-
| `slope status [--sprint=N]` | Show sprint course status + conflicts |
|
|
113
|
+
| `slope roadmap validate` | Validate roadmap dependencies |
|
|
111
114
|
|
|
112
|
-
###
|
|
115
|
+
### Sessions
|
|
113
116
|
|
|
114
117
|
| Command | Description |
|
|
115
118
|
|---------|-------------|
|
|
116
|
-
| `slope
|
|
117
|
-
| `slope
|
|
118
|
-
| `slope
|
|
119
|
-
| `slope
|
|
119
|
+
| `slope session start\|end\|list` | Manage live sessions |
|
|
120
|
+
| `slope claim --target=<t>` | Claim a ticket or area |
|
|
121
|
+
| `slope release --target=<t>` | Release a claim |
|
|
122
|
+
| `slope status` | Sprint status + conflicts |
|
|
120
123
|
|
|
121
|
-
###
|
|
124
|
+
### Maintenance
|
|
122
125
|
|
|
123
126
|
| Command | Description |
|
|
124
127
|
|---------|-------------|
|
|
125
|
-
| `slope
|
|
126
|
-
| `slope
|
|
127
|
-
| `slope
|
|
128
|
-
| `slope init
|
|
129
|
-
| `slope init --all` | Install for all detected platforms |
|
|
130
|
-
| `slope extract --file=<path>` | Extract events into SLOPE store |
|
|
131
|
-
| `slope distill [--auto]` | Promote event patterns to common issues |
|
|
132
|
-
|
|
133
|
-
## Platform Setup
|
|
134
|
-
|
|
135
|
-
### Claude Code
|
|
128
|
+
| `slope extract --file=<path>` | Extract events into store |
|
|
129
|
+
| `slope distill` | Promote patterns to common issues |
|
|
130
|
+
| `slope store health\|backup\|restore` | Store diagnostics and management |
|
|
131
|
+
| `slope flows init\|list\|check` | Manage user flow definitions |
|
|
136
132
|
|
|
137
|
-
|
|
138
|
-
slope init --claude-code
|
|
139
|
-
```
|
|
133
|
+
## Metaphors
|
|
140
134
|
|
|
141
|
-
|
|
142
|
-
- `.claude/rules/` — Sprint checklist, commit discipline, review loop
|
|
143
|
-
- `.claude/hooks/` — Guard dispatcher for real-time guidance
|
|
144
|
-
- `.mcp.json` — SLOPE MCP server config
|
|
145
|
-
- `CLAUDE.md` — Project context
|
|
135
|
+
7 built-in metaphors — same scoring math, different vocabulary:
|
|
146
136
|
|
|
147
|
-
|
|
137
|
+
| Metaphor | Sprint | Ticket | Perfect | On Target |
|
|
138
|
+
|----------|--------|--------|---------|-----------|
|
|
139
|
+
| **Golf** (default) | Sprint | Shot | Hole-in-One | Par |
|
|
140
|
+
| **Tennis** | Set | Point | Ace | Deuce |
|
|
141
|
+
| **Baseball** | Inning | At-Bat | Home Run | Single |
|
|
142
|
+
| **Gaming** | Level | Quest | S-Rank | B-Rank |
|
|
143
|
+
| **D&D** | Quest | Encounter | Natural 20 | DC Met |
|
|
144
|
+
| **Matrix** | Simulation | Anomaly | The One | Stable |
|
|
145
|
+
| **Agile** | Sprint | Story | Shipped | Accepted |
|
|
148
146
|
|
|
149
147
|
```bash
|
|
150
|
-
slope init --
|
|
148
|
+
slope init --metaphor=gaming # Set during init
|
|
149
|
+
slope card --metaphor=tennis # Override per-command
|
|
151
150
|
```
|
|
152
151
|
|
|
153
|
-
|
|
154
|
-
- `.cursor/rules/` — SLOPE methodology rules
|
|
155
|
-
- `.cursor/mcp.json` — MCP server config
|
|
152
|
+
## Documentation
|
|
156
153
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
- `AGENTS.md` — SLOPE methodology (OpenCode reads this format)
|
|
165
|
-
- `.opencode/plugins/slope-plugin.ts` — Event capture plugin
|
|
166
|
-
|
|
167
|
-
## Agent Guidance Hooks
|
|
168
|
-
|
|
169
|
-
SLOPE can guide AI agents in real-time via hook integration. 15 guards provide contextual hints:
|
|
170
|
-
|
|
171
|
-
| Guard | Trigger | What it does |
|
|
172
|
-
|-------|---------|-------------|
|
|
173
|
-
| `explore` | Before search/read | Suggests checking codebase index first |
|
|
174
|
-
| `hazard` | Before file edit | Warns about known issues in the area |
|
|
175
|
-
| `commit-nudge` | After file edit | Nudges commit/push after prolonged editing |
|
|
176
|
-
| `scope-drift` | Before file edit | Warns when editing outside claimed scope |
|
|
177
|
-
| `compaction` | Before context compact | Saves checkpoint to store |
|
|
178
|
-
| `stop-check` | Before session end | Blocks if uncommitted/unpushed work exists |
|
|
179
|
-
| `next-action` | Before session end | Suggests next actions based on sprint state |
|
|
180
|
-
| `subagent-gate` | Before task spawn | Enforces model and turn limits on subagents |
|
|
181
|
-
| `push-nudge` | After tool use | Nudges push after prolonged period without pushing |
|
|
182
|
-
| `workflow-gate` | Before tool use | Enforces sprint workflow compliance |
|
|
183
|
-
| `review-tier` | Before tool use | Suggests review tier based on sprint complexity |
|
|
184
|
-
| `version-check` | Before tool use | Warns when SLOPE version is outdated |
|
|
185
|
-
| `stale-flows` | Before file edit | Warns when editing files in stale flow definitions |
|
|
186
|
-
| `pr-review` | After tool use | Suggests PR review actions |
|
|
187
|
-
| `transcript` | After tool use | Captures session transcript data |
|
|
188
|
-
|
|
189
|
-
Install all guards:
|
|
190
|
-
|
|
191
|
-
```bash
|
|
192
|
-
slope hook add --level=full
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
Guards are non-blocking hints (except `stop-check`) — they inject context, never deny actions.
|
|
196
|
-
|
|
197
|
-
## Configuration
|
|
198
|
-
|
|
199
|
-
After `slope init`, configure `.slope/config.json`:
|
|
200
|
-
|
|
201
|
-
```json
|
|
202
|
-
{
|
|
203
|
-
"scorecardDir": "docs/retros",
|
|
204
|
-
"scorecardPattern": "sprint-*.json",
|
|
205
|
-
"minSprint": 1,
|
|
206
|
-
"metaphor": "golf",
|
|
207
|
-
"commonIssuesPath": ".slope/common-issues.json",
|
|
208
|
-
"sessionsPath": ".slope/sessions.json",
|
|
209
|
-
"roadmapPath": "docs/backlog/roadmap.json",
|
|
210
|
-
"guidance": {
|
|
211
|
-
"disabled": [],
|
|
212
|
-
"commitInterval": 15,
|
|
213
|
-
"pushInterval": 30
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
```
|
|
154
|
+
- **[Getting Started](docs/getting-started.md)** — installation, setup, core concepts, platform guides
|
|
155
|
+
- **[Tutorial: First Sprint](docs/tutorial-first-sprint.md)** — end-to-end walkthrough with example scorecard
|
|
156
|
+
- **[Framework Reference](docs/framework.md)** — full scoring system specification
|
|
157
|
+
- **[Dashboard Guide](docs/guides/dashboard.md)** — live performance dashboard
|
|
158
|
+
- **[Multi-Developer Guide](docs/guides/multi-developer.md)** — team handicap and leaderboard
|
|
159
|
+
- **[Cline Setup](docs/guides/cline-setup.md)** — Cline-specific configuration
|
|
160
|
+
- **[Scorecard Template](docs/scorecard-template.md)** — field-by-field reference
|
|
217
161
|
|
|
218
162
|
## Core API
|
|
219
163
|
|
|
@@ -224,38 +168,23 @@ import {
|
|
|
224
168
|
computeHandicapCard,
|
|
225
169
|
computeDispersion,
|
|
226
170
|
formatSprintReview,
|
|
227
|
-
recommendClub,
|
|
228
|
-
classifyShot,
|
|
229
|
-
generateTrainingPlan,
|
|
230
171
|
buildReportData,
|
|
231
172
|
generateHtmlReport,
|
|
232
|
-
getMetaphor,
|
|
233
173
|
loadScorecards,
|
|
234
|
-
|
|
235
|
-
findingToHazard,
|
|
236
|
-
amendScorecardWithFindings,
|
|
174
|
+
getMetaphor,
|
|
237
175
|
} from '@slope-dev/slope';
|
|
238
|
-
|
|
239
|
-
// Build a scorecard
|
|
240
|
-
const card = buildScorecard({
|
|
241
|
-
sprint_number: 1,
|
|
242
|
-
theme: 'My First Sprint',
|
|
243
|
-
par: 3,
|
|
244
|
-
slope: 0,
|
|
245
|
-
date: '2026-02-22',
|
|
246
|
-
shots: [
|
|
247
|
-
{ ticket_key: 'S1-1', title: 'Setup', club: 'short_iron', result: 'green', hazards: [] },
|
|
248
|
-
{ ticket_key: 'S1-2', title: 'Feature', club: 'short_iron', result: 'in_the_hole', hazards: [] },
|
|
249
|
-
{ ticket_key: 'S1-3', title: 'Tests', club: 'wedge', result: 'green', hazards: [] },
|
|
250
|
-
],
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
// Generate HTML report with gaming metaphor
|
|
254
|
-
const data = buildReportData([card]);
|
|
255
|
-
const gaming = getMetaphor('gaming');
|
|
256
|
-
const html = generateHtmlReport(data, gaming);
|
|
257
176
|
```
|
|
258
177
|
|
|
178
|
+
Published as [`@slope-dev/slope`](https://www.npmjs.com/package/@slope-dev/slope) — includes the scoring engine, SQLite store, CLI (30 commands), and MCP server.
|
|
179
|
+
|
|
180
|
+
## Contributing
|
|
181
|
+
|
|
182
|
+
1. Fork and clone
|
|
183
|
+
2. `pnpm install && pnpm build`
|
|
184
|
+
3. `pnpm test` — runs all tests
|
|
185
|
+
4. `pnpm typecheck` — type checking
|
|
186
|
+
5. Create a feature branch, make changes, submit a PR
|
|
187
|
+
|
|
259
188
|
## License
|
|
260
189
|
|
|
261
190
|
MIT
|
package/dist/adapters.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import './core/adapters/claude-code.js';
|
|
2
2
|
import './core/adapters/cursor.js';
|
|
3
3
|
import './core/adapters/windsurf.js';
|
|
4
|
+
import './core/adapters/cline.js';
|
|
4
5
|
import './core/adapters/generic.js';
|
|
5
6
|
export { registerAdapter, getAdapter, listAdapters, detectAdapter, clearAdapters, resolveToolMatcher, ADAPTER_PRIORITY, TOOL_CATEGORIES, CLAUDE_CODE_TOOLS } from './core/harness.js';
|
|
6
7
|
export type { HarnessAdapter, HarnessId, ToolCategory, ToolNameMap } from './core/harness.js';
|
|
7
8
|
export { ClaudeCodeAdapter, claudeCodeAdapter } from './core/adapters/claude-code.js';
|
|
8
9
|
export { CursorAdapter, cursorAdapter } from './core/adapters/cursor.js';
|
|
9
10
|
export { WindsurfAdapter, windsurfAdapter } from './core/adapters/windsurf.js';
|
|
11
|
+
export { ClineAdapter, clineAdapter } from './core/adapters/cline.js';
|
|
10
12
|
export { GenericAdapter, genericAdapter } from './core/adapters/generic.js';
|
|
13
|
+
export type { ClineHookOutput } from './core/adapters/cline.js';
|
|
11
14
|
export type { GuardManifestEntry } from './core/adapters/generic.js';
|
|
12
15
|
//# sourceMappingURL=adapters.d.ts.map
|
package/dist/adapters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAIA,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AAGpC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtL,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG9F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5E,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAIA,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,0BAA0B,CAAC;AAClC,OAAO,4BAA4B,CAAC;AAGpC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtL,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG9F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5E,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/adapters.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import './core/adapters/claude-code.js';
|
|
5
5
|
import './core/adapters/cursor.js';
|
|
6
6
|
import './core/adapters/windsurf.js';
|
|
7
|
+
import './core/adapters/cline.js';
|
|
7
8
|
import './core/adapters/generic.js';
|
|
8
9
|
// Framework functions
|
|
9
10
|
export { registerAdapter, getAdapter, listAdapters, detectAdapter, clearAdapters, resolveToolMatcher, ADAPTER_PRIORITY, TOOL_CATEGORIES, CLAUDE_CODE_TOOLS } from './core/harness.js';
|
|
@@ -11,5 +12,6 @@ export { registerAdapter, getAdapter, listAdapters, detectAdapter, clearAdapters
|
|
|
11
12
|
export { ClaudeCodeAdapter, claudeCodeAdapter } from './core/adapters/claude-code.js';
|
|
12
13
|
export { CursorAdapter, cursorAdapter } from './core/adapters/cursor.js';
|
|
13
14
|
export { WindsurfAdapter, windsurfAdapter } from './core/adapters/windsurf.js';
|
|
15
|
+
export { ClineAdapter, clineAdapter } from './core/adapters/cline.js';
|
|
14
16
|
export { GenericAdapter, genericAdapter } from './core/adapters/generic.js';
|
|
15
17
|
//# sourceMappingURL=adapters.js.map
|
package/dist/adapters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,+FAA+F;AAE/F,0DAA0D;AAC1D,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AAEpC,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKtL,+BAA+B;AAC/B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,+FAA+F;AAE/F,0DAA0D;AAC1D,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,0BAA0B,CAAC;AAClC,OAAO,4BAA4B,CAAC;AAEpC,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKtL,+BAA+B;AAC/B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AA0GA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFlE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// slope context — Semantic context search for agents
|
|
2
|
+
// Usage: slope context "query" | --ticket=KEY | --file=PATH
|
|
3
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
4
|
+
import { loadConfig } from '../../core/config.js';
|
|
5
|
+
import { embed } from '../../core/embedding-client.js';
|
|
6
|
+
import { hasEmbeddingSupport } from '../../core/embedding-store.js';
|
|
7
|
+
import { deduplicateByFile, formatContextForAgent } from '../../core/context.js';
|
|
8
|
+
import { SqliteSlopeStore } from '../../store/index.js';
|
|
9
|
+
function parseArgs(args) {
|
|
10
|
+
let query = null;
|
|
11
|
+
let ticket = null;
|
|
12
|
+
let file = null;
|
|
13
|
+
let top = 5;
|
|
14
|
+
let format = 'snippets';
|
|
15
|
+
let minScore = 0.0;
|
|
16
|
+
for (const arg of args) {
|
|
17
|
+
if (arg.startsWith('--ticket=')) {
|
|
18
|
+
ticket = arg.slice('--ticket='.length);
|
|
19
|
+
}
|
|
20
|
+
else if (arg.startsWith('--file=')) {
|
|
21
|
+
file = arg.slice('--file='.length);
|
|
22
|
+
}
|
|
23
|
+
else if (arg.startsWith('--top=')) {
|
|
24
|
+
top = parseInt(arg.slice('--top='.length), 10) || 5;
|
|
25
|
+
}
|
|
26
|
+
else if (arg.startsWith('--min-score=')) {
|
|
27
|
+
minScore = parseFloat(arg.slice('--min-score='.length)) || 0;
|
|
28
|
+
}
|
|
29
|
+
else if (arg.startsWith('--format=')) {
|
|
30
|
+
const f = arg.slice('--format='.length);
|
|
31
|
+
if (f === 'paths' || f === 'snippets' || f === 'full') {
|
|
32
|
+
format = f;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (!arg.startsWith('-')) {
|
|
36
|
+
query = arg;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { query, ticket, file, top, format, minScore };
|
|
40
|
+
}
|
|
41
|
+
function resolveTicketQuery(ticketKey, cwd, config) {
|
|
42
|
+
// Try roadmap first
|
|
43
|
+
const roadmapPath = `${cwd}/${config.roadmapPath ?? 'docs/backlog/roadmap.json'}`;
|
|
44
|
+
if (existsSync(roadmapPath)) {
|
|
45
|
+
try {
|
|
46
|
+
const roadmap = JSON.parse(readFileSync(roadmapPath, 'utf8'));
|
|
47
|
+
for (const sprint of roadmap.sprints ?? []) {
|
|
48
|
+
for (const ticket of sprint.tickets ?? []) {
|
|
49
|
+
if (ticket.key === ticketKey || ticket.id === ticketKey) {
|
|
50
|
+
const parts = [ticket.title ?? '', ticket.description ?? ''];
|
|
51
|
+
if (ticket.modules)
|
|
52
|
+
parts.push(ticket.modules.join(' '));
|
|
53
|
+
return parts.filter(Boolean).join(' ');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Fall through
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Try slope-loop backlog
|
|
63
|
+
const backlogPath = `${cwd}/slope-loop/backlog.json`;
|
|
64
|
+
if (existsSync(backlogPath)) {
|
|
65
|
+
try {
|
|
66
|
+
const backlog = JSON.parse(readFileSync(backlogPath, 'utf8'));
|
|
67
|
+
for (const sprint of backlog.sprints ?? []) {
|
|
68
|
+
for (const ticket of sprint.tickets ?? []) {
|
|
69
|
+
if (ticket.key === ticketKey || ticket.id === ticketKey) {
|
|
70
|
+
const parts = [ticket.title ?? '', ticket.description ?? ''];
|
|
71
|
+
if (ticket.modules)
|
|
72
|
+
parts.push(ticket.modules.join(' '));
|
|
73
|
+
return parts.filter(Boolean).join(' ');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Fall through
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Fall back to ticket key as query
|
|
83
|
+
return ticketKey;
|
|
84
|
+
}
|
|
85
|
+
function resolveFileQuery(filePath, cwd) {
|
|
86
|
+
const fullPath = `${cwd}/${filePath}`;
|
|
87
|
+
if (existsSync(fullPath)) {
|
|
88
|
+
try {
|
|
89
|
+
const content = readFileSync(fullPath, 'utf8');
|
|
90
|
+
// Use first 500 chars as query
|
|
91
|
+
return content.slice(0, 500);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return filePath;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return filePath;
|
|
98
|
+
}
|
|
99
|
+
export async function contextCommand(args) {
|
|
100
|
+
const cwd = process.cwd();
|
|
101
|
+
const config = loadConfig(cwd);
|
|
102
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
103
|
+
printUsage();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const flags = parseArgs(args);
|
|
107
|
+
// Determine query text
|
|
108
|
+
let queryText;
|
|
109
|
+
if (flags.ticket) {
|
|
110
|
+
queryText = resolveTicketQuery(flags.ticket, cwd, config);
|
|
111
|
+
}
|
|
112
|
+
else if (flags.file) {
|
|
113
|
+
queryText = resolveFileQuery(flags.file, cwd);
|
|
114
|
+
}
|
|
115
|
+
else if (flags.query) {
|
|
116
|
+
queryText = flags.query;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.error('Error: Provide a search query, --ticket=KEY, or --file=PATH');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
// Resolve embedding config
|
|
123
|
+
const emb = config.embedding;
|
|
124
|
+
if (!emb) {
|
|
125
|
+
console.error('Error: No embedding config in .slope/config.json. Run `slope index` first.');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
const embConfig = {
|
|
129
|
+
endpoint: emb.endpoint,
|
|
130
|
+
model: emb.model,
|
|
131
|
+
dimensions: emb.dimensions,
|
|
132
|
+
apiKey: emb.apiKey,
|
|
133
|
+
};
|
|
134
|
+
// Open store
|
|
135
|
+
const storePath = config.store_path ?? '.slope/slope.db';
|
|
136
|
+
const store = new SqliteSlopeStore(`${cwd}/${storePath}`);
|
|
137
|
+
try {
|
|
138
|
+
if (!hasEmbeddingSupport(store)) {
|
|
139
|
+
throw new Error('Store does not support embeddings. Run `slope index` first.');
|
|
140
|
+
}
|
|
141
|
+
// Check if index exists
|
|
142
|
+
const stats = await store.getEmbeddingStats();
|
|
143
|
+
if (stats.chunkCount === 0) {
|
|
144
|
+
throw new Error('Semantic index is empty. Run `slope index` first.');
|
|
145
|
+
}
|
|
146
|
+
// Embed the query
|
|
147
|
+
const [queryVector] = await embed([queryText], embConfig);
|
|
148
|
+
// Search — fetch more than topK to allow dedup
|
|
149
|
+
const rawResults = await store.searchEmbeddings(queryVector, flags.top * 3);
|
|
150
|
+
// Map to ContextResult
|
|
151
|
+
const contextResults = rawResults.map(r => ({
|
|
152
|
+
filePath: r.filePath,
|
|
153
|
+
chunkIndex: r.chunkIndex,
|
|
154
|
+
snippet: r.chunkText,
|
|
155
|
+
score: r.score,
|
|
156
|
+
}));
|
|
157
|
+
// Deduplicate by file, filter by min score, and limit
|
|
158
|
+
const threshold = flags.minScore > 0 ? flags.minScore : 0.4;
|
|
159
|
+
const deduped = deduplicateByFile(contextResults)
|
|
160
|
+
.filter(r => r.score >= threshold)
|
|
161
|
+
.slice(0, flags.top);
|
|
162
|
+
if (deduped.length === 0) {
|
|
163
|
+
// Output nothing — caller checks for empty
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Format and output
|
|
167
|
+
const output = formatContextForAgent(deduped, flags.format, cwd);
|
|
168
|
+
console.log(output);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
store.close();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function printUsage() {
|
|
175
|
+
console.log(`
|
|
176
|
+
slope context — Semantic context search
|
|
177
|
+
|
|
178
|
+
Usage:
|
|
179
|
+
slope context "search query" Free-text semantic search
|
|
180
|
+
slope context --ticket=S46-1 Use ticket title as query
|
|
181
|
+
slope context --file=src/core/store.ts Find files related to a given file
|
|
182
|
+
slope context --top=10 Limit results (default: 5)
|
|
183
|
+
slope context --format=paths Output file paths only
|
|
184
|
+
slope context --format=snippets Output code snippets (default)
|
|
185
|
+
slope context --format=full Output full file contents of matches
|
|
186
|
+
|
|
187
|
+
Requires a built semantic index. Run \`slope index\` first.
|
|
188
|
+
`);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/distill.ts"],"names":[],"mappings":"AAYA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/distill.ts"],"names":[],"mappings":"AAYA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFlE"}
|