specweave 3.0.10 → 3.0.12
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/.claude-plugin/marketplace.json +2 -2
- package/bin/specweave.js +21 -12
- package/dist/src/cli/commands/auto-handoff.d.ts +36 -11
- package/dist/src/cli/commands/auto-handoff.d.ts.map +1 -1
- package/dist/src/cli/commands/auto-handoff.js +104 -34
- package/dist/src/cli/commands/auto-handoff.js.map +1 -1
- package/dist/src/cli/commands/pickup.d.ts +16 -1
- package/dist/src/cli/commands/pickup.d.ts.map +1 -1
- package/dist/src/cli/commands/pickup.js +91 -12
- package/dist/src/cli/commands/pickup.js.map +1 -1
- package/dist/src/core/hooks/handlers/session-start.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/session-start.js +19 -2
- package/dist/src/core/hooks/handlers/session-start.js.map +1 -1
- package/dist/src/core/session/handoff-list.d.ts +76 -0
- package/dist/src/core/session/handoff-list.d.ts.map +1 -0
- package/dist/src/core/session/handoff-list.js +273 -0
- package/dist/src/core/session/handoff-list.js.map +1 -0
- package/dist/src/core/session/handoff-remote.d.ts +6 -1
- package/dist/src/core/session/handoff-remote.d.ts.map +1 -1
- package/dist/src/core/session/handoff-remote.js +16 -0
- package/dist/src/core/session/handoff-remote.js.map +1 -1
- package/dist/src/core/session/session-checkpoint.d.ts +38 -0
- package/dist/src/core/session/session-checkpoint.d.ts.map +1 -1
- package/dist/src/core/session/session-checkpoint.js +67 -4
- package/dist/src/core/session/session-checkpoint.js.map +1 -1
- package/dist/src/core/session/usage-guard.d.ts +79 -19
- package/dist/src/core/session/usage-guard.d.ts.map +1 -1
- package/dist/src/core/session/usage-guard.js +143 -32
- package/dist/src/core/session/usage-guard.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/skills/handoff/SKILL.md +23 -9
- package/src/templates/AGENTS.md.template +1 -1
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI Commands: pickup, note
|
|
3
3
|
*
|
|
4
|
-
* specweave pickup [
|
|
4
|
+
* specweave pickup [id | increment | title words] [--json]
|
|
5
5
|
* specweave pickup --all [--json]
|
|
6
|
+
* specweave pickup --list [--json] (same as `specweave handoff list`)
|
|
6
7
|
* specweave note "<text>" [incrementId]
|
|
7
8
|
*
|
|
8
9
|
* `pickup` is the one read a fresh session needs, in any tool on any account.
|
|
10
|
+
* When several handoffs are pending (several sessions handed off in one
|
|
11
|
+
* project), it takes the one named, or the newest, and lists the others.
|
|
9
12
|
* `note` leaves a message on an increment for whoever works on it next (another
|
|
10
13
|
* thread, another tool); `pickup` shows the latest notes.
|
|
11
14
|
*
|
|
@@ -20,6 +23,7 @@ import { scrubSecrets } from '../../core/session/handoff-secret-scrub.js';
|
|
|
20
23
|
import { applyHandoff } from '../../core/session/handoff-remote.js';
|
|
21
24
|
import { writeHandoffReport } from '../../core/session/handoff-report.js';
|
|
22
25
|
import { readLatestIndex, renderPickupAll } from '../../core/session/handoff-all.js';
|
|
26
|
+
import { listPendingHandoffs, matchHandoff, markSessionPicked, renderChoices, renderHandoffList, handoffLine, handoffWhere, } from '../../core/session/handoff-list.js';
|
|
23
27
|
export async function pickupCommand(opts = {}) {
|
|
24
28
|
const root = resolveEffectiveRoot(opts.cwd ?? process.cwd());
|
|
25
29
|
if (opts.all) {
|
|
@@ -28,12 +32,65 @@ export async function pickupCommand(opts = {}) {
|
|
|
28
32
|
process.stdout.write((opts.json ? JSON.stringify({ ...latest, text }, null, 2) : text) + '\n');
|
|
29
33
|
return 0;
|
|
30
34
|
}
|
|
35
|
+
if (opts.list)
|
|
36
|
+
return handoffListCommand({ cwd: root, json: opts.json, home: opts.home });
|
|
31
37
|
const agent = opts.agent ?? getAgentId();
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
//
|
|
38
|
+
const target = opts.incrementId?.trim() || undefined;
|
|
39
|
+
const dryRun = opts.apply === false;
|
|
40
|
+
// 1. Which handoff: the one named, else (after fetching) the newest.
|
|
41
|
+
let chosen;
|
|
42
|
+
if (target) {
|
|
43
|
+
const match = matchHandoff(listPendingHandoffs(root, { home: opts.home }), target);
|
|
44
|
+
if (match.kind === 'several') {
|
|
45
|
+
const text = [
|
|
46
|
+
`"${target}" matches ${match.candidates.length} pending handoffs; nothing was picked up. Name one:`,
|
|
47
|
+
...renderChoices(match.candidates),
|
|
48
|
+
'Run `specweave pickup <id>` with one of these ids.',
|
|
49
|
+
].join('\n');
|
|
50
|
+
process.stdout.write((opts.json ? JSON.stringify({ text, candidates: match.candidates }, null, 2) : text) + '\n');
|
|
51
|
+
return 2;
|
|
52
|
+
}
|
|
53
|
+
if (match.kind === 'one')
|
|
54
|
+
chosen = match.handoff;
|
|
55
|
+
}
|
|
56
|
+
// 2. Bring in the latest handoff pushed from any tool, machine or account,
|
|
57
|
+
// unless it belongs to another increment than the one asked for.
|
|
58
|
+
const applied = chosen?.kind === 'session'
|
|
59
|
+
? { status: 'none', message: '' }
|
|
60
|
+
: applyHandoff(root, { dryRun, ...(target ? { increment: chosen?.incrementId ?? target } : {}) });
|
|
61
|
+
const pending = listPendingHandoffs(root, { home: opts.home });
|
|
62
|
+
if (!target && pending.length) {
|
|
63
|
+
const pushed = applied.status === 'applied' ? applied.meta?.increment : undefined;
|
|
64
|
+
chosen = (pushed && pending.find((h) => h.incrementId === pushed)) || pending[0];
|
|
65
|
+
}
|
|
66
|
+
const others = pending.filter((h) => h.id !== chosen?.id);
|
|
67
|
+
const head = [];
|
|
68
|
+
if (chosen) {
|
|
69
|
+
const which = !target && others.length ? `the newest of ${pending.length} pending handoffs` : 'handoff';
|
|
70
|
+
head.push(`Picking up ${which}: ${handoffLine(chosen)}`);
|
|
71
|
+
}
|
|
72
|
+
// 3. A session handoff: its work is still in its own checkout on this machine.
|
|
73
|
+
if (chosen?.kind === 'session') {
|
|
74
|
+
head.push(...describeSession(root, chosen));
|
|
75
|
+
if (applied.message)
|
|
76
|
+
head.push(applied.message);
|
|
77
|
+
let incrementId;
|
|
78
|
+
if (chosen.incrementId) {
|
|
79
|
+
try {
|
|
80
|
+
incrementId = resolveIncrement(root, chosen.incrementId).id;
|
|
81
|
+
}
|
|
82
|
+
catch { /* gone since */ }
|
|
83
|
+
}
|
|
84
|
+
const result = buildPickup(root, { incrementId, agent, checkpointHome: opts.home });
|
|
85
|
+
if (!dryRun)
|
|
86
|
+
markSessionPicked(chosen, agent);
|
|
87
|
+
const text = [...head, result.text, ...othersBlock(others)].filter(Boolean).join('\n');
|
|
88
|
+
process.stdout.write((opts.json ? JSON.stringify({ ...result, text, picked: chosen, pending: others }, null, 2) : text) + '\n');
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
// 4. An increment: describe what is here now.
|
|
35
92
|
let incrementId;
|
|
36
|
-
const wanted =
|
|
93
|
+
const wanted = chosen?.incrementId ?? target ?? (applied.status === 'applied' ? applied.meta?.increment : undefined);
|
|
37
94
|
if (wanted) {
|
|
38
95
|
try {
|
|
39
96
|
incrementId = resolveIncrement(root, wanted).id;
|
|
@@ -41,20 +98,42 @@ export async function pickupCommand(opts = {}) {
|
|
|
41
98
|
catch (e) {
|
|
42
99
|
if (!(e instanceof IncrementResolutionError))
|
|
43
100
|
throw e;
|
|
44
|
-
if (
|
|
45
|
-
|
|
101
|
+
if (target) {
|
|
102
|
+
const lines = [`Nothing pending or in this project matches "${target}". ${e.message}`];
|
|
103
|
+
if (pending.length)
|
|
104
|
+
lines.push('Pending handoffs:', ...renderChoices(pending));
|
|
105
|
+
process.stderr.write(lines.join('\n') + '\n');
|
|
46
106
|
return 1;
|
|
47
107
|
}
|
|
48
108
|
}
|
|
49
109
|
}
|
|
50
|
-
const result = buildPickup(root, { incrementId, agent });
|
|
51
|
-
if (
|
|
52
|
-
|
|
110
|
+
const result = buildPickup(root, { incrementId, agent, checkpointHome: opts.home });
|
|
111
|
+
if (!dryRun && !['dirty', 'diverged', 'failed'].includes(applied.status)) {
|
|
112
|
+
const pushed = applied.status === 'elsewhere' ? undefined : applied.meta?.increment;
|
|
113
|
+
recordPickup(root, chosen?.incrementId ?? pushed ?? result.incrementId, applied, agent);
|
|
53
114
|
}
|
|
54
|
-
const text = [applied.message, result.text].filter(Boolean).join('\n');
|
|
55
|
-
process.stdout.write((opts.json ? JSON.stringify({ ...result, text, handoff: applied }, null, 2) : text) + '\n');
|
|
115
|
+
const text = [...head, applied.message, result.text, ...othersBlock(others)].filter(Boolean).join('\n');
|
|
116
|
+
process.stdout.write((opts.json ? JSON.stringify({ ...result, text, handoff: applied, ...(chosen ? { picked: chosen } : {}), pending: others }, null, 2) : text) + '\n');
|
|
56
117
|
return applied.status === 'failed' ? 1 : 0;
|
|
57
118
|
}
|
|
119
|
+
function describeSession(root, h) {
|
|
120
|
+
const L = [`Continue in ${handoffWhere(root, h)}: its uncommitted edits are still there on this machine.`];
|
|
121
|
+
if (h.docPath)
|
|
122
|
+
L.push(`Read the handoff first: ${h.docPath}${h.diffPath ? ` (edits: ${h.diffPath})` : ''}`);
|
|
123
|
+
return L;
|
|
124
|
+
}
|
|
125
|
+
function othersBlock(others) {
|
|
126
|
+
if (!others.length)
|
|
127
|
+
return [];
|
|
128
|
+
return [`Also pending (${others.length}), for another session:`, ...renderChoices(others), 'Say "pick up <id>" there, or run `specweave pickup <id>`.'];
|
|
129
|
+
}
|
|
130
|
+
/** `specweave handoff list` (and `pickup --list`): pending handoffs, newest first. Changes nothing. */
|
|
131
|
+
export async function handoffListCommand(opts = {}) {
|
|
132
|
+
const root = resolveEffectiveRoot(opts.cwd ?? process.cwd());
|
|
133
|
+
const pending = listPendingHandoffs(root, { home: opts.home });
|
|
134
|
+
process.stdout.write((opts.json ? JSON.stringify(pending, null, 2) : renderHandoffList(root, pending)) + '\n');
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
58
137
|
/**
|
|
59
138
|
* Ledger evidence that the work changed hands: a `pickup` event and the new
|
|
60
139
|
* session, once per handoff. Recorded whenever the increment's last handoff
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickup.js","sourceRoot":"","sources":["../../../../src/cli/commands/pickup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pickup.js","sourceRoot":"","sources":["../../../../src/cli/commands/pickup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAwC5C,eAAO,MAAM,MAAM,EAAE,SAapB,CAAC"}
|
|
@@ -18,6 +18,7 @@ import { pass, sessionContext } from './types.js';
|
|
|
18
18
|
import { readActiveIncrements } from './utils.js';
|
|
19
19
|
import { isGcDue, purgeState, formatBytes } from '../../state/state-gc.js';
|
|
20
20
|
import { buildPickup } from '../../session/pickup.js';
|
|
21
|
+
import { listPendingHandoffs } from '../../session/handoff-list.js';
|
|
21
22
|
const STALE_AUTO_MS = 24 * 60 * 60 * 1000;
|
|
22
23
|
function safeRemove(p) {
|
|
23
24
|
try {
|
|
@@ -60,8 +61,24 @@ export const handle = async (_input, context) => {
|
|
|
60
61
|
safeRemove(path.join(stateDir, 'context-pressure.json'));
|
|
61
62
|
safeRemove(path.join(stateDir, 'prompt-health-alert.json'));
|
|
62
63
|
const { text } = buildPickup(projectRoot, { compact: true, activeIds: readActiveIncrements(projectRoot) });
|
|
63
|
-
|
|
64
|
+
const pending = pendingLine(projectRoot);
|
|
65
|
+
const all = [text, pending].filter(Boolean).join('\n');
|
|
66
|
+
if (!all)
|
|
64
67
|
return pass();
|
|
65
|
-
return sessionContext(`SpecWeave: ${
|
|
68
|
+
return sessionContext(`SpecWeave: ${all}`);
|
|
66
69
|
};
|
|
70
|
+
/** Several sessions handed off here: name them, so "pick up <id>" can take a specific one. */
|
|
71
|
+
function pendingLine(projectRoot) {
|
|
72
|
+
try {
|
|
73
|
+
const pending = listPendingHandoffs(projectRoot);
|
|
74
|
+
if (!pending.length)
|
|
75
|
+
return '';
|
|
76
|
+
const shown = pending.slice(0, 5).map((h) => `${h.id} (${h.title.length > 60 ? h.title.slice(0, 59) + '…' : h.title})`);
|
|
77
|
+
const more = pending.length > 5 ? `, +${pending.length - 5} more` : '';
|
|
78
|
+
return `Pending handoffs, newest first: ${shown.join(', ')}${more}. "pick up" takes the newest; "pick up <id>" a specific one (\`specweave pickup <id>\`).`;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
67
84
|
//# sourceMappingURL=session-start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending handoffs: `specweave handoff list`, and which one `specweave pickup`
|
|
3
|
+
* takes when several sessions handed off in the same project.
|
|
4
|
+
*
|
|
5
|
+
* Two kinds, newest first:
|
|
6
|
+
*
|
|
7
|
+
* - `increment`: an increment whose ledger ends in a `handoff` event with no
|
|
8
|
+
* `pickup` after it. Its id is the increment's four-digit number (the full
|
|
9
|
+
* id when two folders share the number).
|
|
10
|
+
* - `session`: a session that hit the usage limit where an increment handoff
|
|
11
|
+
* would be wrong (several increments active, or it worked in a worktree or a
|
|
12
|
+
* nested repository). Its local checkpoint under `~/.specweave/checkpoints`
|
|
13
|
+
* carries a `handoff.json` mark and no `picked.json` after it. Its id is the
|
|
14
|
+
* checkout's folder name, such as a worktree's.
|
|
15
|
+
*
|
|
16
|
+
* Read-only and offline: no Git, no network, so the SessionStart hook can call it.
|
|
17
|
+
*
|
|
18
|
+
* @module core/session/handoff-list
|
|
19
|
+
*/
|
|
20
|
+
export type PendingHandoffKind = 'increment' | 'session';
|
|
21
|
+
export interface PendingHandoff {
|
|
22
|
+
/** What to type after "pick up": `0874`, or a worktree name such as `studio-routing`. */
|
|
23
|
+
id: string;
|
|
24
|
+
kind: PendingHandoffKind;
|
|
25
|
+
title: string;
|
|
26
|
+
/** ISO time of the handoff. */
|
|
27
|
+
at: string;
|
|
28
|
+
by?: string;
|
|
29
|
+
reason?: string;
|
|
30
|
+
/** Increment folder name, when the handoff belongs to one. */
|
|
31
|
+
incrementId?: string;
|
|
32
|
+
/** Absolute path of the handoff document. */
|
|
33
|
+
docPath?: string;
|
|
34
|
+
/** Session handoffs: the uncommitted edits, the checkout they live in, its branch. */
|
|
35
|
+
diffPath?: string;
|
|
36
|
+
checkout?: string;
|
|
37
|
+
branch?: string;
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
/** Session handoffs: the checkpoint folder that holds the mark. */
|
|
40
|
+
checkpointDir?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ListHandoffsOptions {
|
|
43
|
+
/** Home directory holding `.specweave/checkpoints` (tests). */
|
|
44
|
+
home?: string;
|
|
45
|
+
}
|
|
46
|
+
/** The pending handoffs of a project, newest first, each with a unique id. */
|
|
47
|
+
export declare function listPendingHandoffs(root: string, opts?: ListHandoffsOptions): PendingHandoff[];
|
|
48
|
+
/** The branch checked out in `checkout`, read from `.git` without running Git (worktrees included). */
|
|
49
|
+
export declare function readBranch(checkout: string): string | undefined;
|
|
50
|
+
export declare function slug(s: string): string;
|
|
51
|
+
export type HandoffMatch = {
|
|
52
|
+
kind: 'one';
|
|
53
|
+
handoff: PendingHandoff;
|
|
54
|
+
} | {
|
|
55
|
+
kind: 'several';
|
|
56
|
+
candidates: PendingHandoff[];
|
|
57
|
+
} | {
|
|
58
|
+
kind: 'none';
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Which pending handoff "pick up <query>" means: an exact id, an increment's
|
|
62
|
+
* number or folder name, then every word of the query found in the id, title,
|
|
63
|
+
* branch or folder ("pick up the studio release").
|
|
64
|
+
*/
|
|
65
|
+
export declare function matchHandoff(pending: PendingHandoff[], query: string): HandoffMatch;
|
|
66
|
+
/** Record that a session handoff was taken, so it leaves the list. */
|
|
67
|
+
export declare function markSessionPicked(handoff: PendingHandoff, by: string, now?: Date): void;
|
|
68
|
+
/** One line per handoff: id, title, who, when, why. */
|
|
69
|
+
export declare function handoffLine(h: PendingHandoff): string;
|
|
70
|
+
/** Where a handoff's work is: the document for an increment, the checkout and branch for a session. */
|
|
71
|
+
export declare function handoffWhere(root: string, h: PendingHandoff): string;
|
|
72
|
+
/** What `specweave handoff list` prints. */
|
|
73
|
+
export declare function renderHandoffList(root: string, pending: PendingHandoff[]): string;
|
|
74
|
+
/** The short list shown when a pickup has to ask, or names the others it left. */
|
|
75
|
+
export declare function renderChoices(pending: PendingHandoff[], max?: number): string[];
|
|
76
|
+
//# sourceMappingURL=handoff-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff-list.d.ts","sourceRoot":"","sources":["../../../../src/core/session/handoff-list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAiBH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,yFAAyF;IACzF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAcD,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CAIlG;AAmFD,uGAAuG;AACvG,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW/D;AAUD,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtC;AAkBD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAkBnF;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,CAKnG;AAcD,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAGrD;AAED,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CAOpE;AAED,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAWjF;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,GAAG,SAAI,GAAG,MAAM,EAAE,CAI1E"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending handoffs: `specweave handoff list`, and which one `specweave pickup`
|
|
3
|
+
* takes when several sessions handed off in the same project.
|
|
4
|
+
*
|
|
5
|
+
* Two kinds, newest first:
|
|
6
|
+
*
|
|
7
|
+
* - `increment`: an increment whose ledger ends in a `handoff` event with no
|
|
8
|
+
* `pickup` after it. Its id is the increment's four-digit number (the full
|
|
9
|
+
* id when two folders share the number).
|
|
10
|
+
* - `session`: a session that hit the usage limit where an increment handoff
|
|
11
|
+
* would be wrong (several increments active, or it worked in a worktree or a
|
|
12
|
+
* nested repository). Its local checkpoint under `~/.specweave/checkpoints`
|
|
13
|
+
* carries a `handoff.json` mark and no `picked.json` after it. Its id is the
|
|
14
|
+
* checkout's folder name, such as a worktree's.
|
|
15
|
+
*
|
|
16
|
+
* Read-only and offline: no Git, no network, so the SessionStart hook can call it.
|
|
17
|
+
*
|
|
18
|
+
* @module core/session/handoff-list
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'fs';
|
|
21
|
+
import * as os from 'os';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import { ledgerPath, readIncrementEvents } from '../tasks/ledger.js';
|
|
24
|
+
import { incrementsDir } from '../tasks/resolve-increment.js';
|
|
25
|
+
import { readTitle, ageMs } from './pickup.js';
|
|
26
|
+
import { checkpointsDirectory, SESSION_HANDOFF_FILE, SESSION_PICKED_FILE, summaryTitle, } from './session-checkpoint.js';
|
|
27
|
+
const CLOSED_STATUSES = new Set(['completed', 'complete', 'done', 'abandoned', 'cancelled', 'canceled', 'archived', 'closed']);
|
|
28
|
+
const shortNumber = (id) => id.match(/^\d{4}/)?.[0];
|
|
29
|
+
function readJson(file) {
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function realpath(p) {
|
|
38
|
+
try {
|
|
39
|
+
return fs.realpathSync(p);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return path.resolve(p);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** The pending handoffs of a project, newest first, each with a unique id. */
|
|
46
|
+
export function listPendingHandoffs(root, opts = {}) {
|
|
47
|
+
const items = [...incrementHandoffs(root), ...sessionHandoffs(root, opts.home)];
|
|
48
|
+
items.sort((a, b) => (Date.parse(b.at) || 0) - (Date.parse(a.at) || 0));
|
|
49
|
+
return uniqueIds(items);
|
|
50
|
+
}
|
|
51
|
+
// ── Increment handoffs ─────────────────────────────────────────────────────
|
|
52
|
+
function incrementHandoffs(root) {
|
|
53
|
+
const dir = incrementsDir(root);
|
|
54
|
+
let names;
|
|
55
|
+
try {
|
|
56
|
+
names = fs.readdirSync(dir).filter((n) => /^\d{4}/.test(n)).sort();
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const perNumber = new Map();
|
|
62
|
+
for (const n of names) {
|
|
63
|
+
const num = shortNumber(n);
|
|
64
|
+
perNumber.set(num, (perNumber.get(num) ?? 0) + 1);
|
|
65
|
+
}
|
|
66
|
+
const out = [];
|
|
67
|
+
for (const name of names) {
|
|
68
|
+
const incDir = path.join(dir, name);
|
|
69
|
+
const ledger = ledgerPath(incDir);
|
|
70
|
+
if (!fs.existsSync(ledger))
|
|
71
|
+
continue;
|
|
72
|
+
const status = readJson(path.join(incDir, 'metadata.json'))?.status;
|
|
73
|
+
if (typeof status === 'string' && CLOSED_STATUSES.has(status.trim().toLowerCase()))
|
|
74
|
+
continue;
|
|
75
|
+
const last = readIncrementEvents(ledger, ['handoff', 'pickup']).pop();
|
|
76
|
+
if (last?.e !== 'handoff')
|
|
77
|
+
continue;
|
|
78
|
+
const num = shortNumber(name);
|
|
79
|
+
const doc = ['handoff.md', 'handoff.auto.md'].map((f) => path.join(incDir, f)).find((p) => fs.existsSync(p));
|
|
80
|
+
out.push({
|
|
81
|
+
id: perNumber.get(num) === 1 ? num : name,
|
|
82
|
+
kind: 'increment',
|
|
83
|
+
title: readTitle(incDir).replace(new RegExp(`^${num}\\s*[—–:-]\\s*`), '') || name,
|
|
84
|
+
at: last.at,
|
|
85
|
+
by: last.by,
|
|
86
|
+
...(last.note ? { reason: last.note } : {}),
|
|
87
|
+
incrementId: name,
|
|
88
|
+
...(doc ? { docPath: doc } : {}),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
// ── Session handoffs ───────────────────────────────────────────────────────
|
|
94
|
+
/** Is `child` the project root or inside it? */
|
|
95
|
+
function within(root, child) {
|
|
96
|
+
const rel = path.relative(root, child);
|
|
97
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
98
|
+
}
|
|
99
|
+
function sessionHandoffs(root, home) {
|
|
100
|
+
const base = checkpointsDirectory(home);
|
|
101
|
+
const projectRoot = realpath(root);
|
|
102
|
+
let names;
|
|
103
|
+
try {
|
|
104
|
+
names = fs.readdirSync(base);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const name of names) {
|
|
111
|
+
if (name.startsWith('.') || name === 'studio')
|
|
112
|
+
continue;
|
|
113
|
+
const dir = path.join(base, name);
|
|
114
|
+
const mark = readJson(path.join(dir, SESSION_HANDOFF_FILE));
|
|
115
|
+
if (mark?.version !== 1 || !Date.parse(mark.at))
|
|
116
|
+
continue;
|
|
117
|
+
const picked = readJson(path.join(dir, SESSION_PICKED_FILE));
|
|
118
|
+
if (picked?.at && Date.parse(picked.at) >= Date.parse(mark.at))
|
|
119
|
+
continue;
|
|
120
|
+
const receipt = readJson(path.join(dir, 'current.json'));
|
|
121
|
+
if (receipt?.version !== 1 || typeof receipt.cwd !== 'string' || !within(projectRoot, receipt.cwd))
|
|
122
|
+
continue;
|
|
123
|
+
const branch = readBranch(receipt.cwd);
|
|
124
|
+
const folder = receipt.cwd === projectRoot ? '' : path.basename(receipt.cwd);
|
|
125
|
+
const title = receipt.title ?? docTitle(receipt.docPath) ?? (branch ? `work on ${branch}` : 'session work');
|
|
126
|
+
out.push({
|
|
127
|
+
id: slug(folder) || slug(branch ?? '') || `session-${receipt.sessionId.slice(0, 6)}`,
|
|
128
|
+
kind: 'session',
|
|
129
|
+
title,
|
|
130
|
+
at: mark.at,
|
|
131
|
+
...(mark.by ? { by: mark.by } : {}),
|
|
132
|
+
...(mark.reason ? { reason: mark.reason } : {}),
|
|
133
|
+
...(receipt.incrementId ? { incrementId: receipt.incrementId } : {}),
|
|
134
|
+
...(fs.existsSync(receipt.docPath) ? { docPath: receipt.docPath } : {}),
|
|
135
|
+
...(fs.existsSync(receipt.diffPath) ? { diffPath: receipt.diffPath } : {}),
|
|
136
|
+
checkout: receipt.cwd,
|
|
137
|
+
...(branch ? { branch } : {}),
|
|
138
|
+
sessionId: receipt.sessionId,
|
|
139
|
+
checkpointDir: dir,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** The branch checked out in `checkout`, read from `.git` without running Git (worktrees included). */
|
|
145
|
+
export function readBranch(checkout) {
|
|
146
|
+
try {
|
|
147
|
+
let gitDir = path.join(checkout, '.git');
|
|
148
|
+
if (fs.statSync(gitDir).isFile()) {
|
|
149
|
+
const pointer = fs.readFileSync(gitDir, 'utf8').match(/^gitdir:\s*(.+)$/m)?.[1]?.trim();
|
|
150
|
+
if (!pointer)
|
|
151
|
+
return undefined;
|
|
152
|
+
gitDir = path.resolve(checkout, pointer);
|
|
153
|
+
}
|
|
154
|
+
const head = fs.readFileSync(path.join(gitDir, 'HEAD'), 'utf8').trim();
|
|
155
|
+
return head.match(/^ref:\s*refs\/heads\/(.+)$/)?.[1];
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** First line under "Where I left off" in a checkpoint document (older receipts carry no title). */
|
|
162
|
+
function docTitle(docPath) {
|
|
163
|
+
let text = '';
|
|
164
|
+
try {
|
|
165
|
+
text = fs.readFileSync(docPath, 'utf8');
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
const section = text.split(/^## Where I left off\s*$/m)[1]?.split(/^## /m)[0];
|
|
171
|
+
return summaryTitle(section);
|
|
172
|
+
}
|
|
173
|
+
export function slug(s) {
|
|
174
|
+
return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 40).replace(/-+$/, '');
|
|
175
|
+
}
|
|
176
|
+
/** Two sessions in folders of the same name: the older keeps the name, the newer gets a session suffix. */
|
|
177
|
+
function uniqueIds(items) {
|
|
178
|
+
const seen = new Set();
|
|
179
|
+
const oldestFirst = [...items].reverse();
|
|
180
|
+
for (const item of oldestFirst) {
|
|
181
|
+
if (seen.has(item.id.toLowerCase()) && item.sessionId)
|
|
182
|
+
item.id = `${item.id}-${item.sessionId.slice(0, 4).toLowerCase()}`;
|
|
183
|
+
let n = 2;
|
|
184
|
+
const original = item.id;
|
|
185
|
+
while (seen.has(item.id.toLowerCase()))
|
|
186
|
+
item.id = `${original}-${n++}`;
|
|
187
|
+
seen.add(item.id.toLowerCase());
|
|
188
|
+
}
|
|
189
|
+
return items;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Which pending handoff "pick up <query>" means: an exact id, an increment's
|
|
193
|
+
* number or folder name, then every word of the query found in the id, title,
|
|
194
|
+
* branch or folder ("pick up the studio release").
|
|
195
|
+
*/
|
|
196
|
+
export function matchHandoff(pending, query) {
|
|
197
|
+
const q = query.trim().toLowerCase().replace(/^["'`]+|["'`]+$/g, '').replace(/^(the|my)\s+/, '').trim();
|
|
198
|
+
if (!q)
|
|
199
|
+
return { kind: 'none' };
|
|
200
|
+
const asNumber = /^\d{1,4}$/.test(q) ? q.padStart(4, '0') : undefined;
|
|
201
|
+
const exact = pending.filter((h) => {
|
|
202
|
+
const inc = h.incrementId?.toLowerCase();
|
|
203
|
+
return h.id.toLowerCase() === q || inc === q || (asNumber !== undefined && shortNumber(inc ?? '') === asNumber && h.kind === 'increment');
|
|
204
|
+
});
|
|
205
|
+
if (exact.length)
|
|
206
|
+
return exact.length === 1 ? { kind: 'one', handoff: exact[0] } : { kind: 'several', candidates: exact };
|
|
207
|
+
const words = q.split(/[\s,]+/).filter((w) => w.length > 1 && !['the', 'and', 'of', 'on', 'my', 'one', 'handoff', 'session'].includes(w));
|
|
208
|
+
if (!words.length)
|
|
209
|
+
return { kind: 'none' };
|
|
210
|
+
const hits = pending.filter((h) => {
|
|
211
|
+
const hay = [h.id, h.title, h.branch, h.incrementId, h.checkout ? path.basename(h.checkout) : '', h.reason]
|
|
212
|
+
.filter(Boolean).join(' ').toLowerCase();
|
|
213
|
+
return words.every((w) => hay.includes(w));
|
|
214
|
+
});
|
|
215
|
+
if (hits.length === 1)
|
|
216
|
+
return { kind: 'one', handoff: hits[0] };
|
|
217
|
+
return hits.length ? { kind: 'several', candidates: hits } : { kind: 'none' };
|
|
218
|
+
}
|
|
219
|
+
/** Record that a session handoff was taken, so it leaves the list. */
|
|
220
|
+
export function markSessionPicked(handoff, by, now = new Date()) {
|
|
221
|
+
if (handoff.kind !== 'session' || !handoff.checkpointDir)
|
|
222
|
+
return;
|
|
223
|
+
try {
|
|
224
|
+
fs.writeFileSync(path.join(handoff.checkpointDir, SESSION_PICKED_FILE), JSON.stringify({ by, at: now.toISOString() }, null, 2) + '\n', { mode: 0o600 });
|
|
225
|
+
}
|
|
226
|
+
catch { /* best effort: it stays listed */ }
|
|
227
|
+
}
|
|
228
|
+
// ── Rendering ──────────────────────────────────────────────────────────────
|
|
229
|
+
function homeShort(p) {
|
|
230
|
+
const home = os.homedir();
|
|
231
|
+
return home && (p === home || p.startsWith(home + path.sep)) ? '~' + p.slice(home.length) : p;
|
|
232
|
+
}
|
|
233
|
+
function oneLine(s, max) {
|
|
234
|
+
const flat = s.replace(/\s+/g, ' ').trim();
|
|
235
|
+
return flat.length > max ? flat.slice(0, max - 1) + '…' : flat;
|
|
236
|
+
}
|
|
237
|
+
/** One line per handoff: id, title, who, when, why. */
|
|
238
|
+
export function handoffLine(h) {
|
|
239
|
+
const bits = [h.by, Date.parse(h.at) ? ageMs(Date.parse(h.at)) : '', h.reason ? oneLine(h.reason, 80) : ''].filter(Boolean);
|
|
240
|
+
return `${h.id} ${oneLine(h.title, 80)}${bits.length ? ` · ${bits.join(' · ')}` : ''}`;
|
|
241
|
+
}
|
|
242
|
+
/** Where a handoff's work is: the document for an increment, the checkout and branch for a session. */
|
|
243
|
+
export function handoffWhere(root, h) {
|
|
244
|
+
const rel = (p) => {
|
|
245
|
+
const r = path.relative(root, p);
|
|
246
|
+
return r && !r.startsWith('..') && !path.isAbsolute(r) ? r.split(path.sep).join('/') : homeShort(p);
|
|
247
|
+
};
|
|
248
|
+
if (h.kind === 'session')
|
|
249
|
+
return `${h.checkout ? rel(h.checkout) || '.' : '?'}${h.branch ? ` (branch ${h.branch})` : ''}`;
|
|
250
|
+
return h.docPath ? rel(h.docPath) : `.specweave/increments/${h.incrementId}`;
|
|
251
|
+
}
|
|
252
|
+
/** What `specweave handoff list` prints. */
|
|
253
|
+
export function renderHandoffList(root, pending) {
|
|
254
|
+
if (!pending.length)
|
|
255
|
+
return 'No pending handoffs here. `specweave pickup` still brings in one pushed from another machine.';
|
|
256
|
+
const L = [`${pending.length} pending handoff${pending.length === 1 ? '' : 's'}, newest first:`];
|
|
257
|
+
for (const h of pending) {
|
|
258
|
+
L.push(` ${handoffLine(h)}`);
|
|
259
|
+
L.push(` ${handoffWhere(root, h)}`);
|
|
260
|
+
}
|
|
261
|
+
L.push(pending.length > 1
|
|
262
|
+
? 'Take one with `specweave pickup <id>` (say "pick up <id>"); plain "pick up" takes the newest.'
|
|
263
|
+
: 'Take it with `specweave pickup` (say "pick up").');
|
|
264
|
+
return L.join('\n');
|
|
265
|
+
}
|
|
266
|
+
/** The short list shown when a pickup has to ask, or names the others it left. */
|
|
267
|
+
export function renderChoices(pending, max = 6) {
|
|
268
|
+
const L = pending.slice(0, max).map((h) => ` ${handoffLine(h)}`);
|
|
269
|
+
if (pending.length > max)
|
|
270
|
+
L.push(` (+${pending.length - max} more: \`specweave handoff list\`)`);
|
|
271
|
+
return L;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=handoff-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff-list.js","sourceRoot":"","sources":["../../../../src/core/session/handoff-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,8 @@ export interface PushOptions {
|
|
|
34
34
|
}
|
|
35
35
|
export declare function pushHandoff(repoRoot: string, meta: HandoffMeta, opts?: PushOptions): HandoffPushInfo;
|
|
36
36
|
export interface PickupApplyResult {
|
|
37
|
-
|
|
37
|
+
/** `elsewhere`: the pushed handoff belongs to another increment than the one asked for; nothing changed. */
|
|
38
|
+
status: 'none' | 'applied' | 'here' | 'already' | 'dirty' | 'diverged' | 'failed' | 'elsewhere';
|
|
38
39
|
/** Plain-language summary for the user (empty for `none`). */
|
|
39
40
|
message: string;
|
|
40
41
|
snapshot?: string;
|
|
@@ -56,7 +57,11 @@ export interface ApplyOptions {
|
|
|
56
57
|
remote?: string;
|
|
57
58
|
/** Only report what would happen. */
|
|
58
59
|
dryRun?: boolean;
|
|
60
|
+
/** Apply the pushed handoff only when it is this increment's (`0874` or the folder name). */
|
|
61
|
+
increment?: string;
|
|
59
62
|
}
|
|
63
|
+
/** Does a snapshot's `Handoff-Increment` name the increment the user asked for? */
|
|
64
|
+
export declare function sameIncrement(snapshotIncrement: string | undefined, wanted: string): boolean;
|
|
60
65
|
export declare function applyHandoff(repoRoot: string, opts?: ApplyOptions): PickupApplyResult;
|
|
61
66
|
/** Mark a snapshot as present in this checkout (made here or already applied). */
|
|
62
67
|
export declare function rememberPickup(repoRoot: string, snapshot: string): void;
|