@slope-dev/slope 1.52.0 → 1.54.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/commands/agent.d.ts +35 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +345 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/briefing.d.ts.map +1 -1
- package/dist/cli/commands/briefing.js +5 -3
- package/dist/cli/commands/briefing.js.map +1 -1
- package/dist/cli/commands/commit-ready.d.ts +29 -0
- package/dist/cli/commands/commit-ready.d.ts.map +1 -0
- package/dist/cli/commands/commit-ready.js +263 -0
- package/dist/cli/commands/commit-ready.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +97 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/gate.d.ts +2 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +175 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +4 -0
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +23 -6
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +14 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +230 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/pr.d.ts +49 -0
- package/dist/cli/commands/pr.d.ts.map +1 -0
- package/dist/cli/commands/pr.js +214 -0
- package/dist/cli/commands/pr.js.map +1 -0
- package/dist/cli/commands/review-state.d.ts +1 -2
- package/dist/cli/commands/review-state.d.ts.map +1 -1
- package/dist/cli/commands/review-state.js +79 -25
- package/dist/cli/commands/review-state.js.map +1 -1
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +31 -4
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/sprint-plan.d.ts +21 -0
- package/dist/cli/commands/sprint-plan.d.ts.map +1 -0
- package/dist/cli/commands/sprint-plan.js +226 -0
- package/dist/cli/commands/sprint-plan.js.map +1 -0
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +137 -0
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/ticket.d.ts +9 -0
- package/dist/cli/commands/ticket.d.ts.map +1 -0
- package/dist/cli/commands/ticket.js +168 -0
- package/dist/cli/commands/ticket.js.map +1 -0
- package/dist/cli/commands/version.d.ts.map +1 -1
- package/dist/cli/commands/version.js +33 -4
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/commands/vision.d.ts.map +1 -1
- package/dist/cli/commands/vision.js +14 -1
- package/dist/cli/commands/vision.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 +6 -0
- package/dist/cli/guards/claim-required.d.ts.map +1 -1
- package/dist/cli/guards/claim-required.js +13 -3
- package/dist/cli/guards/claim-required.js.map +1 -1
- package/dist/cli/guards/next-action.d.ts.map +1 -1
- package/dist/cli/guards/next-action.js +3 -2
- package/dist/cli/guards/next-action.js.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.d.ts +18 -0
- package/dist/cli/guards/post-hole-enforcement.d.ts.map +1 -0
- package/dist/cli/guards/post-hole-enforcement.js +100 -0
- package/dist/cli/guards/post-hole-enforcement.js.map +1 -0
- package/dist/cli/guards/pr-review.d.ts +16 -1
- package/dist/cli/guards/pr-review.d.ts.map +1 -1
- package/dist/cli/guards/pr-review.js +87 -5
- package/dist/cli/guards/pr-review.js.map +1 -1
- package/dist/cli/guards/roadmap-edit-shipped.d.ts +12 -0
- package/dist/cli/guards/roadmap-edit-shipped.d.ts.map +1 -0
- package/dist/cli/guards/roadmap-edit-shipped.js +155 -0
- package/dist/cli/guards/roadmap-edit-shipped.js.map +1 -0
- package/dist/cli/index.js +47 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/registry.d.ts +1 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +78 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/core/analyzers/git.d.ts +14 -0
- package/dist/core/analyzers/git.d.ts.map +1 -1
- package/dist/core/analyzers/git.js +47 -0
- package/dist/core/analyzers/git.js.map +1 -1
- package/dist/core/auto-memory.d.ts +19 -0
- package/dist/core/auto-memory.d.ts.map +1 -0
- package/dist/core/auto-memory.js +142 -0
- package/dist/core/auto-memory.js.map +1 -0
- package/dist/core/formatter.d.ts.map +1 -1
- package/dist/core/formatter.js +51 -2
- package/dist/core/formatter.js.map +1 -1
- package/dist/core/guard.d.ts +1 -1
- package/dist/core/guard.d.ts.map +1 -1
- package/dist/core/guard.js +16 -0
- package/dist/core/guard.js.map +1 -1
- package/dist/core/index.d.ts +6 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/json-memory-backend.d.ts +23 -0
- package/dist/core/json-memory-backend.d.ts.map +1 -0
- package/dist/core/json-memory-backend.js +98 -0
- package/dist/core/json-memory-backend.js.map +1 -0
- package/dist/core/memory-backend.d.ts +30 -0
- package/dist/core/memory-backend.d.ts.map +1 -0
- package/dist/core/memory-backend.js +14 -0
- package/dist/core/memory-backend.js.map +1 -0
- package/dist/core/memory-types.d.ts +25 -0
- package/dist/core/memory-types.d.ts.map +1 -0
- package/dist/core/memory-types.js +4 -0
- package/dist/core/memory-types.js.map +1 -0
- package/dist/core/memory-validation.d.ts +4 -0
- package/dist/core/memory-validation.d.ts.map +1 -0
- package/dist/core/memory-validation.js +35 -0
- package/dist/core/memory-validation.js.map +1 -0
- package/dist/core/memory.d.ts +41 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +167 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/pi-settings.d.ts.map +1 -1
- package/dist/core/pi-settings.js +12 -0
- package/dist/core/pi-settings.js.map +1 -1
- package/dist/core/review.d.ts.map +1 -1
- package/dist/core/review.js +5 -0
- package/dist/core/review.js.map +1 -1
- package/dist/core/roadmap.d.ts +16 -2
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +81 -24
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/vision.d.ts +10 -0
- package/dist/core/vision.d.ts.map +1 -1
- package/dist/core/vision.js +68 -1
- package/dist/core/vision.js.map +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +18 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite-memory-backend.d.ts +43 -0
- package/dist/store/sqlite-memory-backend.d.ts.map +1 -0
- package/dist/store/sqlite-memory-backend.js +181 -0
- package/dist/store/sqlite-memory-backend.js.map +1 -0
- package/dist/store-pg/index.d.ts.map +1 -1
- package/dist/store-pg/index.js +23 -0
- package/dist/store-pg/index.js.map +1 -1
- package/package.json +1 -1
- package/packages/pi-extension/dist/index.d.ts +19 -0
- package/packages/pi-extension/dist/index.js +435 -17
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slope memory — Cross-session memory management CLI
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* slope memory add <text> [--category=X] [--weight=N]
|
|
6
|
+
* slope memory list [--category=X] [--limit=N]
|
|
7
|
+
* slope memory remove <id>
|
|
8
|
+
* slope memory edit <id> <text>
|
|
9
|
+
* slope memory search <query>
|
|
10
|
+
* slope memory import <file>
|
|
11
|
+
* slope memory export <file>
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { loadMemories, saveMemories, addMemory, removeMemory, updateMemory, searchMemories, validateMemory, detectSecret, SecretDetectedError, } from '../../core/memory.js';
|
|
15
|
+
function parseFlags(args) {
|
|
16
|
+
const flags = {};
|
|
17
|
+
for (const arg of args) {
|
|
18
|
+
const match = arg.match(/^--(\w[\w-]*)(?:=(.+))?$/);
|
|
19
|
+
if (match)
|
|
20
|
+
flags[match[1]] = match[2] ?? 'true';
|
|
21
|
+
}
|
|
22
|
+
return flags;
|
|
23
|
+
}
|
|
24
|
+
function isValidCategory(c) {
|
|
25
|
+
return ['workflow', 'style', 'project', 'hazard', 'other'].includes(c);
|
|
26
|
+
}
|
|
27
|
+
export async function memoryCommand(args) {
|
|
28
|
+
const sub = args[0];
|
|
29
|
+
const rest = args.slice(1);
|
|
30
|
+
const flags = parseFlags(rest);
|
|
31
|
+
const cwd = process.cwd();
|
|
32
|
+
switch (sub) {
|
|
33
|
+
case 'add':
|
|
34
|
+
addSubcommand(rest, flags, cwd);
|
|
35
|
+
break;
|
|
36
|
+
case 'list':
|
|
37
|
+
listSubcommand(flags, cwd);
|
|
38
|
+
break;
|
|
39
|
+
case 'remove':
|
|
40
|
+
removeSubcommand(rest, cwd);
|
|
41
|
+
break;
|
|
42
|
+
case 'edit':
|
|
43
|
+
editSubcommand(rest, flags, cwd);
|
|
44
|
+
break;
|
|
45
|
+
case 'search':
|
|
46
|
+
searchSubcommand(rest, flags, cwd);
|
|
47
|
+
break;
|
|
48
|
+
case 'import':
|
|
49
|
+
importSubcommand(rest, cwd);
|
|
50
|
+
break;
|
|
51
|
+
case 'export':
|
|
52
|
+
exportSubcommand(rest, cwd);
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
console.log(`
|
|
56
|
+
slope memory — Cross-session memory management
|
|
57
|
+
|
|
58
|
+
Usage:
|
|
59
|
+
slope memory add <text> [--category=workflow|style|project|hazard|other] [--weight=1-10]
|
|
60
|
+
slope memory list [--category=X] [--limit=N]
|
|
61
|
+
slope memory remove <id>
|
|
62
|
+
slope memory edit <id> <new-text>
|
|
63
|
+
slope memory search <query> [--category=X] [--limit=N]
|
|
64
|
+
slope memory import <file.json>
|
|
65
|
+
slope memory export <file.json>
|
|
66
|
+
`);
|
|
67
|
+
if (sub)
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function addSubcommand(args, flags, cwd) {
|
|
72
|
+
const positionals = args.filter(a => !a.startsWith('--'));
|
|
73
|
+
if (positionals.length === 0) {
|
|
74
|
+
console.error('Usage: slope memory add <text> [--category=X] [--weight=N] [--allow-secrets]');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
if (positionals.length > 1) {
|
|
78
|
+
console.error(`Error: 'add' takes a single text argument; got ${positionals.length}. Quote the text if it contains spaces.`);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
const text = positionals[0];
|
|
82
|
+
const category = isValidCategory(flags.category ?? '') ? flags.category : 'other';
|
|
83
|
+
const weight = flags.weight ? parseInt(flags.weight, 10) : 8;
|
|
84
|
+
const allowSecrets = flags['allow-secrets'] === 'true';
|
|
85
|
+
let mem;
|
|
86
|
+
try {
|
|
87
|
+
mem = addMemory(cwd, text, { category, weight, source: 'manual', allowSecrets });
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (err instanceof SecretDetectedError) {
|
|
91
|
+
console.error(`Error: ${err.message}`);
|
|
92
|
+
console.error('Pass --allow-secrets if this is intentional.');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
console.log(`\nMemory added: ${mem.id.slice(0, 16)}…`);
|
|
98
|
+
console.log(` ${mem.text.slice(0, 80)}`);
|
|
99
|
+
console.log(` [${mem.category}] weight:${mem.weight}\n`);
|
|
100
|
+
}
|
|
101
|
+
function listSubcommand(flags, cwd) {
|
|
102
|
+
const results = searchMemories(cwd, {
|
|
103
|
+
category: isValidCategory(flags.category ?? '') ? flags.category : undefined,
|
|
104
|
+
limit: flags.limit ? parseInt(flags.limit, 10) : undefined,
|
|
105
|
+
});
|
|
106
|
+
if (results.length === 0) {
|
|
107
|
+
console.log('\nNo memories found.\n');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(`\n=== Memories (${results.length}) ===\n`);
|
|
111
|
+
for (const m of results) {
|
|
112
|
+
const date = new Date(m.updatedAt).toLocaleDateString();
|
|
113
|
+
console.log(` ${m.id.slice(0, 12)} [${m.category}] w:${m.weight} ${date}`);
|
|
114
|
+
console.log(` ${m.text.slice(0, 100)}${m.text.length > 100 ? '…' : ''}`);
|
|
115
|
+
}
|
|
116
|
+
console.log('');
|
|
117
|
+
}
|
|
118
|
+
function removeSubcommand(args, cwd) {
|
|
119
|
+
const id = args.find(a => !a.startsWith('--'));
|
|
120
|
+
if (!id) {
|
|
121
|
+
console.error('Usage: slope memory remove <id>');
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
const ok = removeMemory(cwd, id);
|
|
125
|
+
if (ok) {
|
|
126
|
+
console.log('\nMemory removed.\n');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
console.log('\nMemory not found.\n');
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function editSubcommand(args, _flags, cwd) {
|
|
134
|
+
const id = args[0];
|
|
135
|
+
const text = args.slice(1).find(a => !a.startsWith('--'));
|
|
136
|
+
if (!id || !text) {
|
|
137
|
+
console.error('Usage: slope memory edit <id> <new-text>');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
const mem = updateMemory(cwd, id, { text });
|
|
141
|
+
if (mem) {
|
|
142
|
+
console.log(`\nMemory updated: ${mem.id.slice(0, 12)}…`);
|
|
143
|
+
console.log(` ${mem.text.slice(0, 80)}\n`);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
console.log('\nMemory not found.\n');
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function searchSubcommand(args, flags, cwd) {
|
|
151
|
+
const query = args.find(a => !a.startsWith('--'));
|
|
152
|
+
const results = searchMemories(cwd, {
|
|
153
|
+
query,
|
|
154
|
+
category: isValidCategory(flags.category ?? '') ? flags.category : undefined,
|
|
155
|
+
limit: flags.limit ? parseInt(flags.limit, 10) : 10,
|
|
156
|
+
});
|
|
157
|
+
if (results.length === 0) {
|
|
158
|
+
console.log('\nNo memories found.\n');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
console.log(`\n=== Search Results (${results.length}) ===\n`);
|
|
162
|
+
for (const m of results) {
|
|
163
|
+
console.log(` ${m.id.slice(0, 12)} [${m.category}] w:${m.weight}`);
|
|
164
|
+
console.log(` ${m.text.slice(0, 100)}${m.text.length > 100 ? '…' : ''}`);
|
|
165
|
+
}
|
|
166
|
+
console.log('');
|
|
167
|
+
}
|
|
168
|
+
function importSubcommand(args, cwd) {
|
|
169
|
+
const file = args.find(a => !a.startsWith('--'));
|
|
170
|
+
const allowSecrets = args.includes('--allow-secrets');
|
|
171
|
+
if (!file) {
|
|
172
|
+
console.error('Usage: slope memory import <file.json> [--allow-secrets]');
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const imported = JSON.parse(readFileSync(file, 'utf8'));
|
|
177
|
+
const data = loadMemories(cwd);
|
|
178
|
+
const existingIds = new Set(data.memories.map(m => m.id));
|
|
179
|
+
const items = Array.isArray(imported)
|
|
180
|
+
? imported
|
|
181
|
+
: imported && Array.isArray(imported.memories)
|
|
182
|
+
? imported.memories
|
|
183
|
+
: [];
|
|
184
|
+
let added = 0;
|
|
185
|
+
let skipped = 0;
|
|
186
|
+
let secretsBlocked = 0;
|
|
187
|
+
for (const item of items) {
|
|
188
|
+
let validated;
|
|
189
|
+
try {
|
|
190
|
+
validated = validateMemory(item);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
skipped++;
|
|
194
|
+
console.error(` skip: ${err.message}`);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (!allowSecrets && detectSecret(validated.text)) {
|
|
198
|
+
secretsBlocked++;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// Regenerate id on collision so import is non-destructive
|
|
202
|
+
while (existingIds.has(validated.id)) {
|
|
203
|
+
validated = { ...validated, id: `${validated.id}-${Math.random().toString(36).slice(2, 6)}` };
|
|
204
|
+
}
|
|
205
|
+
existingIds.add(validated.id);
|
|
206
|
+
data.memories.push(validated);
|
|
207
|
+
added++;
|
|
208
|
+
}
|
|
209
|
+
saveMemories(cwd, data);
|
|
210
|
+
console.log(`\nImported ${added} memories${skipped ? `, skipped ${skipped}` : ''}${secretsBlocked ? `, blocked ${secretsBlocked} suspected-secret` : ''}.\n`);
|
|
211
|
+
if (secretsBlocked > 0 && !allowSecrets) {
|
|
212
|
+
console.error('Re-run with --allow-secrets to include the blocked entries.');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
console.error(`Import failed: ${err.message}`);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function exportSubcommand(args, cwd) {
|
|
221
|
+
const file = args.find(a => !a.startsWith('--'));
|
|
222
|
+
if (!file) {
|
|
223
|
+
console.error('Usage: slope memory export <file.json>');
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
const data = loadMemories(cwd);
|
|
227
|
+
writeFileSync(file, JSON.stringify(data, null, 2) + '\n');
|
|
228
|
+
console.log(`\nExported ${data.memories.length} memories to ${file}\n`);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `slope pr ...` — agent-friendly PR helpers.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* slope pr finalize [--pr=N] [--dry-run] Auto-add `Closes #N` lines to PR
|
|
6
|
+
* body for any issue refs in commit
|
|
7
|
+
* messages that GitHub's auto-close
|
|
8
|
+
* parser would otherwise miss (#321).
|
|
9
|
+
* slope pr issues [--pr=N] Print extracted issue refs (helper).
|
|
10
|
+
*
|
|
11
|
+
* Background: commits like `fix: ... (GH #297, #299)` or `… closes #314` mix
|
|
12
|
+
* close-able patterns with non-canonical wording. Without one of GitHub's
|
|
13
|
+
* magic keywords (`Close[s|d]`, `Fix[es|ed]`, `Resolve[s|d]`) on its own line
|
|
14
|
+
* adjacent to the issue number, the issue stays open even after merge — the
|
|
15
|
+
* scenario surfaced in PR #317.
|
|
16
|
+
*/
|
|
17
|
+
interface FinalizeOptions {
|
|
18
|
+
pr?: number;
|
|
19
|
+
dryRun?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function prCommand(args: string[]): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Extract all issue numbers referenced anywhere in `text`. Matches `#NNN`
|
|
24
|
+
* or `(GH #NNN)` or `gh-NNN` regardless of surrounding wording. Returns
|
|
25
|
+
* unique sorted ascending integers.
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractIssueRefs(text: string): number[];
|
|
28
|
+
/**
|
|
29
|
+
* Identify issues that GitHub will already auto-close from a PR body —
|
|
30
|
+
* that is, ones already on a `Close[s|d]/Fix[es|ed]/Resolve[s|d] #N` form.
|
|
31
|
+
* Returns them as a Set so callers can subtract.
|
|
32
|
+
*/
|
|
33
|
+
export declare function existingAutoCloseRefs(prBody: string): Set<number>;
|
|
34
|
+
interface FinalizeResult {
|
|
35
|
+
pr: number;
|
|
36
|
+
branch: string;
|
|
37
|
+
found: number[];
|
|
38
|
+
alreadyClosed: number[];
|
|
39
|
+
toAdd: number[];
|
|
40
|
+
newBodyAppendix: string | null;
|
|
41
|
+
applied: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Compute the finalize plan without applying it. Pure-ish (only reads
|
|
45
|
+
* git/gh state). Test-friendly.
|
|
46
|
+
*/
|
|
47
|
+
export declare function planPrFinalize(opts: FinalizeOptions): Promise<FinalizeResult | null>;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=pr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pr.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB7D;AAqED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAWjE;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAqD1F"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
export async function prCommand(args) {
|
|
3
|
+
const sub = args[0];
|
|
4
|
+
if (sub === '--help' || sub === '-h' || sub === undefined) {
|
|
5
|
+
printHelp();
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (sub === 'finalize') {
|
|
9
|
+
await finalizeSubcommand(args.slice(1));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (sub === 'issues') {
|
|
13
|
+
await issuesSubcommand(args.slice(1));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
console.error(`\nUnknown pr subcommand: ${sub}\n`);
|
|
17
|
+
printHelp();
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
function printHelp() {
|
|
21
|
+
console.log(`
|
|
22
|
+
slope pr — Pull request helpers
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
slope pr finalize [--pr=N] [--dry-run] Inject Closes #N for issues referenced in commit
|
|
26
|
+
messages but missing from PR body (#321).
|
|
27
|
+
slope pr issues [--pr=N] Print extracted issue refs from the branch's
|
|
28
|
+
commit messages.
|
|
29
|
+
|
|
30
|
+
Defaults:
|
|
31
|
+
--pr Resolved from current branch via \`gh pr view --json number\`.
|
|
32
|
+
`);
|
|
33
|
+
}
|
|
34
|
+
function parseFlags(args) {
|
|
35
|
+
const opts = {};
|
|
36
|
+
for (const a of args) {
|
|
37
|
+
if (a.startsWith('--pr='))
|
|
38
|
+
opts.pr = parseInt(a.slice('--pr='.length), 10);
|
|
39
|
+
else if (a === '--dry-run')
|
|
40
|
+
opts.dryRun = true;
|
|
41
|
+
}
|
|
42
|
+
return opts;
|
|
43
|
+
}
|
|
44
|
+
function git(cmd) {
|
|
45
|
+
try {
|
|
46
|
+
return execSync(`git ${cmd}`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Wrapper around `gh` CLI invocations. Throws a contextual error when gh
|
|
53
|
+
* is missing or auth fails so callers can surface a clear message instead
|
|
54
|
+
* of the raw spawn ENOENT / 401 stderr. */
|
|
55
|
+
function gh(cmd) {
|
|
56
|
+
try {
|
|
57
|
+
return execSync(`gh ${cmd}`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = err.stderr?.toString().trim()
|
|
61
|
+
?? err.message
|
|
62
|
+
?? 'unknown gh error';
|
|
63
|
+
if (/command not found|ENOENT/i.test(msg)) {
|
|
64
|
+
throw new Error('gh CLI is not installed. Install from https://cli.github.com/');
|
|
65
|
+
}
|
|
66
|
+
if (/authentication required|gh auth login|HTTP 401/i.test(msg)) {
|
|
67
|
+
throw new Error('gh CLI is not authenticated. Run `gh auth login` first.');
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`gh ${cmd}: ${msg}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve the PR number — explicit flag wins, otherwise ask gh which PR is
|
|
74
|
+
* associated with the current branch.
|
|
75
|
+
*/
|
|
76
|
+
function resolvePrNumber(opts) {
|
|
77
|
+
if (opts.pr && !isNaN(opts.pr))
|
|
78
|
+
return opts.pr;
|
|
79
|
+
try {
|
|
80
|
+
const out = gh('pr view --json number');
|
|
81
|
+
const parsed = JSON.parse(out);
|
|
82
|
+
return parsed.number ?? null;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extract all issue numbers referenced anywhere in `text`. Matches `#NNN`
|
|
90
|
+
* or `(GH #NNN)` or `gh-NNN` regardless of surrounding wording. Returns
|
|
91
|
+
* unique sorted ascending integers.
|
|
92
|
+
*/
|
|
93
|
+
export function extractIssueRefs(text) {
|
|
94
|
+
const found = new Set();
|
|
95
|
+
// Lookbehind avoids in-word matches like `abc#1234` (commit-SHA-style refs).
|
|
96
|
+
const re = /(?<![A-Za-z0-9])#(\d{1,6})\b/g;
|
|
97
|
+
let m;
|
|
98
|
+
while ((m = re.exec(text)) !== null) {
|
|
99
|
+
const n = parseInt(m[1], 10);
|
|
100
|
+
if (n > 0)
|
|
101
|
+
found.add(n);
|
|
102
|
+
}
|
|
103
|
+
return [...found].sort((a, b) => a - b);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Identify issues that GitHub will already auto-close from a PR body —
|
|
107
|
+
* that is, ones already on a `Close[s|d]/Fix[es|ed]/Resolve[s|d] #N` form.
|
|
108
|
+
* Returns them as a Set so callers can subtract.
|
|
109
|
+
*/
|
|
110
|
+
export function existingAutoCloseRefs(prBody) {
|
|
111
|
+
const found = new Set();
|
|
112
|
+
// Match the canonical magic keywords (case-insensitive) followed by #N.
|
|
113
|
+
// Multiple targets per keyword: "Closes #1, #2, #3"
|
|
114
|
+
const re = /\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\b[^.\n]*?#(\d{1,6})/gi;
|
|
115
|
+
let m;
|
|
116
|
+
while ((m = re.exec(prBody)) !== null) {
|
|
117
|
+
const n = parseInt(m[1], 10);
|
|
118
|
+
if (n > 0)
|
|
119
|
+
found.add(n);
|
|
120
|
+
}
|
|
121
|
+
return found;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Compute the finalize plan without applying it. Pure-ish (only reads
|
|
125
|
+
* git/gh state). Test-friendly.
|
|
126
|
+
*/
|
|
127
|
+
export async function planPrFinalize(opts) {
|
|
128
|
+
const pr = resolvePrNumber(opts);
|
|
129
|
+
if (!pr)
|
|
130
|
+
return null;
|
|
131
|
+
let metaJson;
|
|
132
|
+
try {
|
|
133
|
+
metaJson = gh(`pr view ${pr} --json baseRefName,headRefName,body,title`);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const meta = JSON.parse(metaJson);
|
|
139
|
+
const base = meta.baseRefName ?? 'main';
|
|
140
|
+
const branch = meta.headRefName ?? '';
|
|
141
|
+
const body = meta.body ?? '';
|
|
142
|
+
// Pull commit messages from the branch (commits not yet on base).
|
|
143
|
+
// Try origin/<branch>..origin/<base> first; fall back to origin/<base>..HEAD
|
|
144
|
+
// when the branch doesn't have a remote (or the remote ref is stale). The
|
|
145
|
+
// previous version embedded a `||` shell fallback inside the git() arg
|
|
146
|
+
// string which obscured the failure mode.
|
|
147
|
+
const tryRange = branch ? `origin/${base}..origin/${branch}` : `origin/${base}..HEAD`;
|
|
148
|
+
let commitText = git(`log ${tryRange} --format=%B`);
|
|
149
|
+
if (!commitText) {
|
|
150
|
+
commitText = git(`log origin/${base}..HEAD --format=%B`);
|
|
151
|
+
}
|
|
152
|
+
const fromCommits = extractIssueRefs(commitText);
|
|
153
|
+
const fromTitle = extractIssueRefs(meta.title ?? '');
|
|
154
|
+
const fromBody = extractIssueRefs(body);
|
|
155
|
+
const referenced = [...new Set([...fromCommits, ...fromTitle, ...fromBody])].sort((a, b) => a - b);
|
|
156
|
+
const alreadyClosed = existingAutoCloseRefs(body);
|
|
157
|
+
const toAdd = referenced.filter(n => !alreadyClosed.has(n));
|
|
158
|
+
const appendix = toAdd.length > 0
|
|
159
|
+
? `\n\n` + toAdd.map(n => `Closes #${n}.`).join('\n') + '\n'
|
|
160
|
+
: null;
|
|
161
|
+
return {
|
|
162
|
+
pr,
|
|
163
|
+
branch,
|
|
164
|
+
found: referenced,
|
|
165
|
+
alreadyClosed: [...alreadyClosed].sort((a, b) => a - b),
|
|
166
|
+
toAdd,
|
|
167
|
+
newBodyAppendix: appendix,
|
|
168
|
+
applied: false,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async function finalizeSubcommand(args) {
|
|
172
|
+
const opts = parseFlags(args);
|
|
173
|
+
const plan = await planPrFinalize(opts);
|
|
174
|
+
if (!plan) {
|
|
175
|
+
console.error('\nCould not resolve PR — pass --pr=N or run from a branch with an open PR.\n');
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
console.log(`\nPR #${plan.pr} (${plan.branch || 'current branch'}):`);
|
|
179
|
+
console.log(` Issues referenced: ${plan.found.length === 0 ? '(none)' : plan.found.map(n => `#${n}`).join(', ')}`);
|
|
180
|
+
console.log(` Already auto-closes: ${plan.alreadyClosed.length === 0 ? '(none)' : plan.alreadyClosed.map(n => `#${n}`).join(', ')}`);
|
|
181
|
+
console.log(` Will add Closes for: ${plan.toAdd.length === 0 ? '(none)' : plan.toAdd.map(n => `#${n}`).join(', ')}`);
|
|
182
|
+
if (plan.toAdd.length === 0) {
|
|
183
|
+
console.log('\n Nothing to update — PR already references all matching issues with auto-close keywords.\n');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (opts.dryRun) {
|
|
187
|
+
console.log('\n [dry-run] Appendix that would be added:\n');
|
|
188
|
+
console.log(plan.newBodyAppendix);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Apply: edit PR body via gh
|
|
192
|
+
const currentBody = gh(`pr view ${plan.pr} --json body --jq .body`);
|
|
193
|
+
const newBody = currentBody + (plan.newBodyAppendix ?? '');
|
|
194
|
+
// gh expects the body via --body — pass through stdin to avoid shell quoting hazards
|
|
195
|
+
execSync(`gh pr edit ${plan.pr} --body-file -`, { input: newBody, encoding: 'utf8' });
|
|
196
|
+
console.log(`\n Updated PR #${plan.pr} body with ${plan.toAdd.length} Closes line(s).\n`);
|
|
197
|
+
}
|
|
198
|
+
async function issuesSubcommand(args) {
|
|
199
|
+
const opts = parseFlags(args);
|
|
200
|
+
const plan = await planPrFinalize(opts);
|
|
201
|
+
if (!plan) {
|
|
202
|
+
console.error('Could not resolve PR — pass --pr=N or run from a branch with an open PR.');
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
if (plan.found.length === 0) {
|
|
206
|
+
console.log('No issue refs found in commit messages or PR body.');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
for (const n of plan.found) {
|
|
210
|
+
const auto = plan.alreadyClosed.includes(n);
|
|
211
|
+
console.log(`#${n}\t${auto ? 'auto-closes' : 'open'}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=pr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../src/cli/commands/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,7 @@ export interface ReviewState {
|
|
|
9
9
|
export declare function loadReviewState(cwd: string): ReviewState | null;
|
|
10
10
|
export declare function saveReviewState(cwd: string, state: ReviewState): void;
|
|
11
11
|
export interface FindingsFile {
|
|
12
|
-
|
|
13
|
-
findings: ReviewFinding[];
|
|
12
|
+
sprints: Record<number, ReviewFinding[]>;
|
|
14
13
|
}
|
|
15
14
|
export declare function loadFindings(cwd: string): FindingsFile | null;
|
|
16
15
|
export declare function reviewStateCommand(args: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-state.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/review-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,qBAAqB,CAAC;AASrF,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ/D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAIrE;AAsHD,MAAM,WAAW,YAAY;IAC3B,
|
|
1
|
+
{"version":3,"file":"review-state.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/review-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,qBAAqB,CAAC;AASrF,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ/D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAIrE;AAsHD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CAC1C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAc7D;AA0TD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtE"}
|